2013-06-04 4 views
0

어떤 정의가 extern "C" { ... }으로 싸여있는 C++ 라이브러리 코드가 있다고 가정 해 보겠습니다.여러 C++ 및 C 오브젝트 파일에서 하나의 .so 생성하기

또한 해당 C++ 라이브러리를 사용하는 C 라이브러리 코드가 있습니다.

내가하고 싶은 것은 하나의 .so 파일을 만드는 것인데, dlopen을 한 번만 호출하면이 라이브러리를 사용할 수 있습니다.

다음은 현재 내가하고있는 것입니다. -shared -rdynamic -fPIC .so 파일로 내 C++ 라이브러리를 먼저 컴파일하고 있습니다. 그런 다음 동일한 매개 변수를 사용하여 C 라이브러리를 .so 파일로 컴파일합니다. 그 후 C 라이브러리를로드하기 전에 dload으로 C++ 라이브러리를로드해야합니다. 그렇지 않으면 undefined symbol 오류로로드가 실패합니다.

나는이 두 라이브러리를 하나의 .so 파일로 컴파일하여 dload에 대한 한 번만 호출하면 충분합니다.

어떻게하면됩니까?

미리 감사드립니다.

편집 : .o 파일로 컴파일 한 다음 결합이 작동하지 않습니다. 여기에 내가 할 수있는 작업은 다음과 같습니다

  • 나는 undefined symbol: __gxx_personality_v0 오류가, 내가로드 할 때
  • 내가 clang [list of object files] -shared -rdynamic -fPIC -o libmylib.so
  • 로 연결 -fPIC 매개 변수를 사용하여 객체 파일을 각 파일을 컴파일합니다.

EDIT2 : 아, 나는 이것을 libstdc++과 연결시켜줍니다. 이제 작동합니다. 감사.

+1

모든 오브젝트 파일을 연결 줄에 인수로 붙이면됩니까? –

+0

@MatsPetersson, 어떤 이유로 든 작동하지 않습니다. 오브젝트 파일로 컴파일하는 동안 추가 매개 변수를 사용해야합니까? – sinan

+0

@sinan 해결되지 않은 기호입니까? 그렇다면 특정 순서로 링크해야합니다. http://stackoverflow.com/q/45135/23643 –

답변

1
  1. 가장 쉬운 방법은 하나의 공유 라이브러리로를 연결하는 모든 오브젝트 파일을 결합, 또는 두 개의 정적 .a 라이브러리를 구축하고 중 하나에 의해 하나의 .so 파일로 결합하는 것입니다.
  2. 실제로 두 개의 .so 파일을 보관하려면 실행 파일과 마찬가지로 첫 번째 라이브러리를 두 번째 라이브러리에 연결하십시오. 예 : libfoolibbar에 달려있는 경우 libfoo-lbar으로 컴파일하십시오. 기본 라이브러리 경로 또는 LD_LIBRARY_PATH 환경 변수에 종속 라이브러리가 있어야합니다.
+0

답변 해 주셔서 감사합니다. "기본 라이브러리 경로 또는 LD_LIBRARY_PATH 환경 변수에 종속 라이브러리가 있어야합니다."나는 원하지 않습니다. 하나만 제외하고 모두 .so를 완전히 제거하고 여전히로드 할 수 있기를 원합니다. 귀하의 첫 번째 제안에 관해서는 어떻게 모든 객체 파일을 결합 할 수 있습니까? 어떤 매개 변수를 객체 파일로 컴파일해야합니까? – sinan

+0

@sinan 이미 가지고있는 두 개의 라이브러리를 어떻게 링크합니까? 모든 파일을 하나의 명령 행에 저장하십시오. –

관련 문제