--start-group 및 --end-group 명령 줄 옵션은 무엇입니까?


83

이러한 명령 줄 옵션의 목적은 무엇입니까? 다음 명령 줄의 의미를 해독하는 데 도움을주세요.

분명히 그것은 연결과 관련이 있지만 GNU 매뉴얼은 정확히 그룹화가 의미하는 바를 조용합니다.

답변:


97

여러 라이브러리 ( -(및 사이에 나열 됨) 간의 순환 종속성을 해결하기위한 것 -)입니다.

인용 라이브러리가 링크 된 순서가 때때로 GCC에서 오류를 일으키는 이유는 무엇입니까? 또는 man ld http://linux.die.net/man/1/ld

-( 아카이브 -) 또는 --start-group 아카이브 --end-group

아카이브는 아카이브 파일의 목록이어야합니다. 명시 적 파일 이름이거나 -l 옵션 일 수 있습니다.

지정된 아카이브는 정의되지 않은 새 참조가 생성되지 않을 때까지 반복적으로 검색됩니다. 일반적으로 아카이브는 명령 줄에 지정된 순서대로 한 번만 검색됩니다. 나중에 명령 줄에 나타나는 아카이브의 개체가 참조하는 정의되지 않은 기호를 확인하는 데 해당 아카이브의 기호가 필요한 경우 링커는 해당 참조를 확인할 수 없습니다. 아카이브를 그룹화하면 가능한 모든 참조가 해결 될 때까지 모두 반복적으로 검색됩니다.

이 옵션을 사용하면 상당한 성능 비용이 발생합니다. 둘 이상의 아카이브 사이에 불가피한 순환 참조가있을 때만 사용하는 것이 가장 좋습니다.

따라서 그룹 내의 라이브러리에서 새 기호를 여러 번 검색 할 수 있으며 다음과 같은 추악한 구성이 필요하지 않습니다. -llib1 -llib2 -llib1

PS 아카이브는 기본적으로 정적 라이브러리 ( *.a파일)를 의미합니다.


1
수락되었습니다. 비고 : 전체 파일 이름 (경로 및 접미사 포함)이 명령 줄에 전달되지 않는 한 GCC가 먼저 동적 라이브러리를 사용한다고 생각합니다. -llib1은 GCC가 먼저 % .so 파일에 링크를 시도한 다음 % .a 파일을 시도하도록합니다.
pic11

1
@ pic11, 감사합니다. 링크는 ld에 의해 수행되며 -Wl,--verbosegcc에 옵션을 추가하여 라이브러리가 검색되는 방법을 볼 수 있습니다 ( --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. 도서관 검색 디렉토리의 모든 디렉토리에서 수행됩니다.
osgx 2011

"새 기호를 여러 번 검색했습니다"? 두 번 검색하면 모든 기호를 해결하는 데 충분하다고 생각합니다. 그것은해야 하지상당한 성능 비용.
Jimm Chen

10
죄송합니다. 드디어 "두 번 검색"이 충분하지 않다는 것을 깨달았습니다.
Jimm Chen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.