gcc가 사용하지 않는 정적 라이브러리를 연결하도록 강제하는 방법
프로그램과 정적 라이브러리가 있습니다.
// main.cpp
int main() {}
// mylib.cpp
#include <iostream>
struct S {
S() { std::cout << "Hello World\n";}
};
S s;
정적 라이브러리를 연결하고 싶습니다(libmylib.a
) 프로그램 개체(main.o
), 후자는 전자의 어떤 기호도 직접적으로 사용하지 않습니다.
다음 명령은 작업에 사용되지 않는 것 같습니다.g++ 4.7
오류나 경고 없이 실행되지만, 보기에는libmylib.a
연결되지 않음:
g++ -o program main.o -Wl,--no-as-needed /path/to/libmylib.a
또는
g++ -o program main.o -L/path/to/ -Wl,--no-as-needed -lmylib
더 좋은 생각이 있습니까?
사용하다--whole-archive
링커 옵션
명령줄에서 이 다음에 오는 라이브러리에는 참조되지 않은 기호가 삭제되지 않습니다.다음을 추가하여 정상적인 연결 동작을 재개할 수 있습니다.--no-whole-archive
이 도서관들 뒤에.
이 예에서 명령은 다음과 같습니다.
g++ -o program main.o -Wl,--whole-archive /path/to/libmylib.a
일반적으로 다음과 같습니다.
g++ -o program main.o \
-Wl,--whole-archive -lmylib \
-Wl,--no-whole-archive -llib1 -llib2
원래의 제안은 "밀착"이었습니다.
사용해 보십시오.-Wl,--whole-archive -lyourlib
저는 다른 답변이 더 좋지만, 여기 또 다른 "해결책"이 있습니다.
ar 명령을 사용하여 아카이브에서 모든 .o 파일의 압축을 풉니다.
cd mylib ; ar x /path/to/libmylib.a
그런 다음 모든 .o 파일을 링커 명령에 추가합니다.
g++ -o program main.o mylib/*.o
정적 라이브러리에 사용되지 않은 것으로 링커에 의해 제거되는 특정 함수가 있지만 실제로 필요한 경우(한 가지 일반적인 예는 JNI_OnLoad() 함수) 함수), 링커가 이 함수를 유지하도록 강제할 수 있습니다(그리고 자연스럽게 이 함수에서 호출되는 모든 코드).더하다-u JNI_OnLoad
링크 명령으로 이동합니다.
언급URL : https://stackoverflow.com/questions/14116420/how-to-force-gcc-to-link-an-unused-static-library
'programing' 카테고리의 다른 글
repo를 가져온 후 생성된 원격 분기에 대해 git-svn에 어떻게 알립니까? (0) | 2023.07.08 |
---|---|
"for(;;)"는 무엇을 의미합니까? (0) | 2023.07.08 |
워드프레스에서 레이저페이 결제 게이트웨이를 통합하는 방법 (0) | 2023.07.03 |
Mongoose - 그룹화 및 채우기 방법 (0) | 2023.07.03 |
장고를 위한 파이몽고 vs 몽고 엔진. (0) | 2023.07.03 |