programing

gcc가 사용하지 않는 정적 라이브러리를 연결하도록 강제하는 방법

subpage 2023. 7. 8. 10:52
반응형

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

저는 다른 답변이 더 좋지만, 여기 또 다른 "해결책"이 있습니다.

  1. ar 명령을 사용하여 아카이브에서 모든 .o 파일의 압축을 풉니다.

    cd mylib ; ar x /path/to/libmylib.a
    
  2. 그런 다음 모든 .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

반응형