이러한 명령 줄 옵션의 목적은 무엇입니까? 다음 명령 줄의 의미를 해독하는 데 도움을주세요.
-Wl,--start-group -lmy_lib -lyour_lib -lhis_lib -Wl,--end-group -ltheir_lib
분명히 그것은 연결과 관련이 있지만 GNU 매뉴얼은 정확히 그룹화가 의미하는 바를 조용합니다.
답변:
여러 라이브러리 ( -(
및 사이에 나열 됨) 간의 순환 종속성을 해결하기위한 것 -)
입니다.
인용 라이브러리가 링크 된 순서가 때때로 GCC에서 오류를 일으키는 이유는 무엇입니까? 또는 man ld
http://linux.die.net/man/1/ld
-(
아카이브-)
또는--start-group
아카이브--end-group
아카이브는 아카이브 파일의 목록이어야합니다. 명시 적 파일 이름이거나 -l 옵션 일 수 있습니다.
지정된 아카이브는 정의되지 않은 새 참조가 생성되지 않을 때까지 반복적으로 검색됩니다. 일반적으로 아카이브는 명령 줄에 지정된 순서대로 한 번만 검색됩니다. 나중에 명령 줄에 나타나는 아카이브의 개체가 참조하는 정의되지 않은 기호를 확인하는 데 해당 아카이브의 기호가 필요한 경우 링커는 해당 참조를 확인할 수 없습니다. 아카이브를 그룹화하면 가능한 모든 참조가 해결 될 때까지 모두 반복적으로 검색됩니다.
이 옵션을 사용하면 상당한 성능 비용이 발생합니다. 둘 이상의 아카이브 사이에 불가피한 순환 참조가있을 때만 사용하는 것이 가장 좋습니다.
따라서 그룹 내의 라이브러리에서 새 기호를 여러 번 검색 할 수 있으며 다음과 같은 추악한 구성이 필요하지 않습니다. -llib1 -llib2 -llib1
PS 아카이브는 기본적으로 정적 라이브러리 ( *.a
파일)를 의미합니다.
-Wl,--verbose
gcc에 옵션을 추가하여 라이브러리가 검색되는 방법을 볼 수 있습니다 ( --verbose
링커 ld에 전달됨). 예 : -ltest
라이브러리 : attempt to open /lib/libtest.so failed \n attempt to open /lib/libtest.a failed \n attempt to open /usr/lib/libtest.so failed \n attempt to open /usr/lib/libtest.a failed \n
. 링커는 .so
먼저 열려고 시도한 다음 .a
. 도서관 검색 디렉토리의 모든 디렉토리에서 수행됩니다.