2012-03-09 2 views

답변

2

3 개의 C++ 소스 파일에서 각각 a.cc, b.cc 및 c.cc라는 라이브러리를 컴파일하는 경우;


g++ -fpic -Wall -c a.cc 

g++ -fpic -Wall -c b.cc 

g++ -fpic -Wall -c c.cc 

g++ -shared -Wl,-soname,libmylib.so.0 -o libmylib.so.0.0.0 a.o b.o c.o 

그런 다음, ldconfig를을 사용하여 라이브러리를 설치합니다 (다음과 같이

man 8 ldconfig

당신이 다음 libary를 사용하는 프로그램을 컴파일 할 수 를 볼 수 있지만 헤더 파일의 클래스 선언 이전

extern "C"
을 접두사로 확인 라이브러리를 사용하여 소스 코드에 포함되어 있습니다.)

그램 ++ -o MYPROG main.cc -lmylib

,

나는이 컴파일 옵션을 내 자신의 샘플 코드로 시도해 봤으며 성공했다.

기본적으로 적용되는 내용은 Shared Libraries이며, gcc를 g ++로 바꾸면 C++에 적용됩니다.

이 모든 것의 이론은 다음과 같습니다.

라이브러리는 프로그램이 처음로드 될 때 동적으로로드됩니다. 실행중인 프로그램에서 시스템 호출 추적을 수행하여 확인할 수 있습니다. strace -o trace.txt ls은 실행 중에 프로그램이 trace.txt 파일로 시스템 호출 목록을 덤프합니다. 파일의 맨 위에서 프로그램 (이 경우 ls)이 실제로 모든 라이브러리를 메모리로 mmap했음을 알 수 있습니다.

라이브러리가 동적으로로드되기 때문에 런타임 중에 라이브러리 코드가 프로그램의 가상 주소 공간에 존재하는 링크 시간은 알 수 없습니다.따라서 위치 독립적 코드를 사용하여 라이브러리 코드를 컴파일해야합니다. 따라서 번역 단계에서 위치 독립적 코드를 염두에두고 코딩 된 어셈블리 코드를 생성하도록 지정하는 -fpic 옵션이 있습니다. gcc/g++-S (대문자 S) 옵션을 사용하여 번역 단계를 중단 한 다음 -fpic 옵션을 사용하여 한 번 결과 '.s'파일을보고 한 번만 입력하면 차이가 표시됩니다 (예 : 동적 코드는 적어도 x86_64에서 @GOTPCREL과 @PLT를가집니다.

링커는 물론 모든 ELF 재배치 가능 객체 유형을 Linux 공유 라이브러리로 사용하기에 적합한 실행 가능 코드로 링크하도록 지시해야합니다.

3

하나의 GCC 버전에서 다음 GCC 버전으로 (예 : g++-4.4에서 g++-4.6까지) GCC C++ ABI 규칙이 약간 변경되었습니다 (특히 C++ 표준 라이브러리 발전 또는 이름 맹 글링 규칙 때문에). 공유 라이브러리는 g++의 버전을 구축하는 데 사용

당신이 기호는 바람직하게해야 dlsym에 공개적으로 액세스 할 수 있도록하려는 경우 (실제로, 변경 g ++이 아닌 영향을받을 수 있도록 내부 종종 작은) 그것을 선언하십시오 extern "C" 당신 안에 r 헤더 파일 (그렇지 않으면 mangle its name이어야 함).

공유 라이브러리를 만드는 방법은 Program Library Howto과 같은 설명서를 참조하십시오.

this question

참조 그리고 (예 : Makefile -s) 일반 명령 줄 도구를 사용하여 공유 라이브러리를 구축하는 것이 좋습니다. NetBeans/Eclipse와 같은 복잡한 IDE에 의존하지 마십시오 (어쨌든 명령 행 유틸리티를 호출합니다).

+0

Netbeans/Eclipse를 사용하지 않는 이유는 무엇입니까? 그들은 일을 쉽게 만듭니다. Visual Studio에서도 명령 줄을 사용하지만 명령 줄에서 Windows의 모든 내용을 컴파일하고 링크하는 권장 사항을 들어 본 적이 없습니다. –

+0

예,하지만이 스레드는 unix/linux의 공유 코드/라이브러리에 관한 것이므로 명령 줄에서 컴파일하는 것이 일반적입니다. 실제로 특정 컴파일 명령은 make 파일에 있고 명령 행에서 시작하는 make 유틸리티 만 (대개 'make'와 같은 아주 간단한 명령으로) – vyudh

관련 문제