다음 시나리오를 고려하십시오.
- 종속성이없는 공유 라이브러리 libA.so.
- 종속성으로 libA.so를 사용하는 공유 라이브러리 libB.so.
libB와 연결되는 바이너리 파일을 컴파일하고 싶습니다. 바이너리를 libB 와만 연결해야합니까? 아니면 libA와 연결해야합니까?
런타임에 대한 종속성에서 해결되지 않은 기호를 해결할 수 있도록 직접 종속성과 만 연결하는 방법이 있습니까?
라이브러리 libB 구현이 향후 변경되어 다른 종속성 (예 : libC, libD, libE)을 도입 할 수 있다는 사실이 걱정됩니다. 그게 문제가 될까요?
다시 말해:
- libA 파일 : a.cpp ah
- libB 파일 : b.cpp bh
- 주 프로그램 파일 : main.cpp
물론 b.cpp에는 ah가 포함되고 main.cpp에는 bh가 포함됩니다.
컴파일 명령 :
g++ -fPIC a.cpp -c
g++ -shared -o libA.so a.o
g++ -fPIC b.cpp -c -I.
g++ -shared -o libB.so b.o -L. -lA
다음 중 어떤 옵션을 사용해야합니까?
g++ main.cpp -o main -I. -L. -lB
또는
g++ main.cpp -o main -I. -L. -lB -lA
첫 번째 옵션을 사용할 수 없습니다. 링커는 라이브러리 libA의 해결되지 않은 기호에 대해 불평합니다. 하지만 좀 이상하게 들립니다.
매우 감사합니다.
-업데이트 된 댓글 :
바이너리를 링크하면 링커는 main과 libB의 모든 심볼을 확인하려고합니다. 그러나 libB에는 libA의 정의되지 않은 기호가 있습니다. 이것이 링커가 그것에 대해 불평하는 이유입니다.
그래서 libA 와도 연결해야합니다. 그러나 공유 라이브러리에서 해결되지 않은 기호를 무시하는 방법을 찾았습니다. 다음 명령 줄을 사용하여 수행해야하는 것 같습니다.
g++ main.cpp -o main -I. -L. -lB -Wl,-unresolved-symbols=ignore-in-shared-libs
여전히 -rpath
옵션 을 사용할 수있는 것 같습니다. 그러나 나는 그것을 조금 더 잘 이해할 필요가있다.
-Wl,-unresolved-symbols=ignore-in-shared-libs
옵션을 사용할 때 가능한 함정을 아는 사람이 있습니까?
-업데이트 된 댓글 2 :
-rpath
이 목적으로 사용해서는 안됩니다. 주어진 디렉토리에서 라이브러리를 강제로 찾는 것이 유용합니다. -unresolved-symbol
접근 방식은 훨씬 더 보인다.
다시 한 번 감사드립니다.