내 요구 사항은 일부 인터페이스 .h 파일에서 작업하는 것입니다. 지금은 .h 및 .cpp/.cc 파일이 내 프로젝트에 있습니다.C++ 코드에 대해 64 비트 공유 64 비트 Linux 호환 라이브러리 (* .so)를 만드는 방법
Linux Fedora에서 NetBeans/Eclipse를 사용하여 공유 64 비트 Linux 호환 라이브러리 (* .so)로 컴파일해야합니다.
내 요구 사항은 일부 인터페이스 .h 파일에서 작업하는 것입니다. 지금은 .h 및 .cpp/.cc 파일이 내 프로젝트에 있습니다.C++ 코드에 대해 64 비트 공유 64 비트 Linux 호환 라이브러리 (* .so)를 만드는 방법
Linux Fedora에서 NetBeans/Eclipse를 사용하여 공유 64 비트 Linux 호환 라이브러리 (* .so)로 컴파일해야합니다.
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 공유 라이브러리로 사용하기에 적합한 실행 가능 코드로 링크하도록 지시해야합니다.
하나의 GCC 버전에서 다음 GCC 버전으로 (예 : g++-4.4
에서 g++-4.6
까지) GCC C++ ABI 규칙이 약간 변경되었습니다 (특히 C++ 표준 라이브러리 발전 또는 이름 맹 글링 규칙 때문에). 공유 라이브러리는 g++
의 버전을 구축하는 데 사용
당신이 기호는 바람직하게해야 dlsym에 공개적으로 액세스 할 수 있도록하려는 경우 (실제로, 변경 g ++이 아닌 영향을받을 수 있도록 내부 종종 작은) 그것을 선언하십시오 extern "C"
당신 안에 r 헤더 파일 (그렇지 않으면 mangle its name이어야 함).
공유 라이브러리를 만드는 방법은 Program Library Howto과 같은 설명서를 참조하십시오.
참조 그리고 (예 : Makefile
-s) 일반 명령 줄 도구를 사용하여 공유 라이브러리를 구축하는 것이 좋습니다. NetBeans/Eclipse와 같은 복잡한 IDE에 의존하지 마십시오 (어쨌든 명령 행 유틸리티를 호출합니다).
Netbeans/Eclipse를 사용하지 않는 이유는 무엇입니까? 그들은 일을 쉽게 만듭니다. Visual Studio에서도 명령 줄을 사용하지만 명령 줄에서 Windows의 모든 내용을 컴파일하고 링크하는 권장 사항을 들어 본 적이 없습니다. –
예,하지만이 스레드는 unix/linux의 공유 코드/라이브러리에 관한 것이므로 명령 줄에서 컴파일하는 것이 일반적입니다. 실제로 특정 컴파일 명령은 make 파일에 있고 명령 행에서 시작하는 make 유틸리티 만 (대개 'make'와 같은 아주 간단한 명령으로) – vyudh
gcc를 사용하면 간단하고 좋습니다. – Deepak