2009-10-23 3 views
2

는 I 라이브러리 Y.에 따라 라이브러리 X 제가 C++ 링커 질문 - 동적 및 정적 라이브러리 의존성

라이브러리 Y 정적 라이브러리로서 만 사용할 수 있다고 가정 X.로부터 함수를 호출하는 인앱가있을 . X와 Y가 App A에 정적으로 링크되어 있으면 모든 것이 잘 동작합니다. 그러나 X가 동적 (공유) 라이브러리가되기를 원합니다.

현재, Y 정적 동적 X대로 작동하지 않는 링크를 갖는 동적 라이브러리로 Y를 얻을 수있는 방법이 필요없이 거기에

Y.

에서 무엇을 볼 수 없습니다에 정적으로 Y로 X 연결 ? 우리가 동적 인 버전의 Y를 가질 수 있도록 Y를 감싸는 것은 괜찮지 않습니다. 일반적으로 Y (정적으로 A에 링크 된)를 X (동적 라이브러리)에 노출시키는 링커 옵션이 있습니까?

이유 나는 또한 Y에 의존하는 라이브러리 Z가 있다는 것입니다. X를 Z와 Z로 정적으로 연결하지 않고 X와 Z가 동적 일 수 있기를 바랄뿐입니다.

희망 사항을 혼동하지 않기를 바랍니다. 어떤 도움을 주셔서 감사합니다.

답변

1

글쎄, 그것은 .so를에 정적 라이브러리를 변환하는 매우 간단합니다

의 gcc -shared library.a -oliblibrary.so

그 그것을 해결합니까?

+0

답장을 보내 주셔서 감사합니다. 정적 라이브러리를 만질 수는 없지만 정적 라이브러리로 남아 있어야합니다. 어떻게 든 정적 라이브러리 (앱에 링크 된)를 동적 인 라이브러리에 노출시킬 수 있는지 궁금합니다. –

+1

동적 라이브러리의 심볼은로드 타임에 해석됩니다 ... 그래서, 정의되지 않은 참조가있는 동적으로로드 된 라이브러리는 앱에 대한 의존성을 해결할 수 있어야합니다. 이 기능이 작동하는 경우 알려 주시면 다른 답변을 작성하겠습니다. – dicroce

0

당신이 지적한대로 - Y를 감싸거나 동적 인 Y가 있다면 문제가 해결 될 것입니다.

Y를 동적으로 바꾸려면 왜 그럴 수 없습니까?

동적 Y를 가져올 수없는 이유는 무엇입니까?

당신은 정적 그런 다음 응용 프로그램을 Y. 링크 X의 동적 버전을 컴파일하려면 당신이 ... Z와 당신은 기본적으로 모든 옵션을 제거하는 X 용

3

를 Y를 연결해야 할 수도 있습니다 귀하의 비타협적 인 제약을 감안할 때 X 만 링크하고 Y를 사용하지 않는다. 내가 할 수있는 것과하지 않는 것은 플랫폼에 따라 다르다. 나는 GCC와 GNU 링커가 허용한다는 것을 알고있다. 문제는 정적 라이브러리로 사용하기 위해 컴파일 된 코드와 동적 라이브러리로 사용하기 위해 컴파일 된 코드가 동일하지 않다는 것입니다. 동적 라이브러리는 메모리 영역에 재배치 될 수 있도록 생성됩니다 (이로 인해 공유 가능하게됩니다). Linux 및 Solaris에서는 공유 라이브러리가 "-fpic"지시문으로 컴파일된다는 것을 의미합니다. 공유 라이브러리를 만들 때 PIC와 PIC가 아닌 코드를 섞으면 (이것은 Y를 X에 정적으로 연결할 때 일어나는 일입니다), 확인되지 않은 텍스트 재배치에 대한 오류가 발생합니다. 즉, 해당 부분을 불평하는 링커입니다 귀하의 도서관에 대한 정보는 공유 할 수 없습니다. -mimpure-text를 전달하여 경고를 비활성화 할 수 있습니다. 그러나 "-fpic"(즉, Y에 대한 호출이 포함 된 페이지)로 컴파일되지 않은 코드가 포함 된 메모리의 모든 페이지는 이 앱간에 공유되지 않습니다. 따라서 여러 응용 프로그램에서 라이브러리를 사용하는 경우 일반적으로 공유 라이브러리를 사용하여 전체 메모리를 절약 할 수 없습니다. 플랫폼에 MSVC가있는 경우 Windows에 해당 플래그가있을 수 있습니다.

편집 : 내 첫 읽기에서 Z에 대한 문제를 잡지 못했습니다. GCC가 정의되지 않은 기호를 무시하도록 X와 Z를 "-z undefs"로 컴파일 해보십시오. 그러면 앱을 연결할 때 Y가 X와 Z 다음에 링크 라인 (후기 라이브러리는 이전 라이브러리에서 찾은 참조를 채 웁니다).

관련 문제