2010-05-18 1 views
3

나는 현재하고 있어요 :링크 하나의 공유 라이브러리 정적 내가 프로젝트에 연결하기위한 몇 가지 옵션이 조금 struggeling하고

내가이 기타에 링크 된 공유 라이브러리를 만들려고하고 있어요 라이브러리. (libfoo.solibbar.so)
출력 라이브러리가 공유 라이브러리 여야하며 결과 라이브러리에 libfoo.so 정적 링크를 연결하고 싶지만 libbar.so은 동적 라이브러리로 연결해야합니다. (libbar.so은 모든 컴퓨터에서 사용할 수 있어야하며, libfoo.so을 사용할 수없고 사용자가 설치/내 바이너리와 함께 보내지 않기를 바랍 니 다.)

어떻게 보관할 수 있습니까?

내 현재 빌드 명령어는 다음과 같다 :

c++ -Wall -shared -c -o src/lib.o src/lib.cpp 
c++ -Wall -shared -o lib.ndll src/lib.o -lfoo -lbar 

나는 내 방어 :이 질문은 바보 같은 것 같다 있다면, 그래서 유감 C/C++ 전문가가 아니다.

+1

이 http://stackoverflow.com/questions/2812079/compile-a-의 중복 나에게 보인다 shared-library-statically/2812137 – AProgrammer

+0

libfoo.so의 정적 버전이 없습니다 – TheHippo

+0

제가 아는 한, 그럴 수 없습니다. 링커 설명서를 다시 한 번 확인하십시오. – AProgrammer

답변

10

두 가지 Linux C/C++ 라이브러리 유형이 있습니다.

  • 정적 라이브러리 (*.a)를 연계하여 애플리케이션의 일부가되는 객체 코드의 보관한다. 이 파일은 ar(1) 명령을 사용하여 생성되며 조작 할 수 있습니다 (즉, ar -t libfoo.a은 라이브러리/아카이브에있는 파일을 나열합니다).

  • 동적으로 링크 된 공유 객체 라이브러리 (*.so)는 두 가지 방법으로 사용할 수 있습니다.

    1. 공유 오브젝트 라이브러리는 런타임에 동적으로 링크 될 수 있지만 정적으로 인식 할 수 있습니다. 컴파일/링크 단계에서 라이브러리를 사용할 수 있어야합니다. 공유 오브젝트는 2 진 실행 파일에 포함되지 않지만 실행에 연결됩니다.
    2. 공유 오브젝트 라이브러리는 동적 연결 로더 시스템 기능을 사용하여 실행 중에 동적으로로드/언로드되고 링크 될 수 있습니다. 위해

정적 바이너리에 libfoo.so을 연결하는, 일반적으로 libfoo.a라고 해당 정적 라이브러리가 필요합니다. 실행 가능 프로그램을 작성할 때 컴파일 W 링크 프로세스의 일부로 호출하여 정적 라이브러리를 사용할 수 있습니다.

것이 빌드를 변경 할 결과는 같은 것으로 명령

다음

g++ -Wall -fPIC -c -o src/lib.o src/lib.cpp 
g++ -shared -Wl,-soname,mylib.so.1 -o mylib.so.1 src/lib.o -L/path/to/library-directory -lbar libfoo.a 
관련 문제