컴파일러 명령줄에서 라이브러리 이름 앞에 소스 파일 이름을 입력해야 하는 이유는 무엇입니까?

컴파일러 명령줄에서 라이브러리 이름 앞에 소스 파일 이름을 입력해야 하는 이유는 무엇입니까?

OpenSUSE 사용자로서 저는 다음을 입력하는 데 익숙합니다.

gcc -lz myfile.c

놀랍게도 Ubuntu에서는 이 명령이 다음과 같이 실패합니다.

myfile.c:(.text+0x5): undefined reference to `zlibVersion'
collect2: error: ld returned 1 exit status

Ubuntu의 GCC C 컴파일러는 로 시작하는 명령을 생성하는 반면 OpenSUSE에서는 이 옵션이 존재하지 않는다는 gcc -v것을 발견했습니다 . 즉, Ubuntu의 명령줄은 다음과 같습니다.collect2--as-needed

/usr/lib/gcc/x86_64-linux-gnu/5/collect2 --build-id --eh-frame-hdr\
-m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker \
....[a lot of stuff removed].....\
-lz /tmp/cc7kz9Nz.o ....[yet more stuff removed].....\
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o

OpenSUSE에서는 옵션을 제외하면 매우 유사해 보입니다 --as-needed.

/usr/lib64/gcc/x86_64-suse-linux/4.8/collect2 --build-id --eh-frame-hdr\
-m elf_x86_64 -dynamic-linker \
....[a lot of stuff removed].....\
-lz /tmp/cccpZlmL.o ....[yet more stuff removed].....\
/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../lib64/crtn.o

이 차이는 어디에서 오는가? 이 내용이 어딘가에서 논의된 적이 있나요? 소스파일명 앞에 라이브러리명을 넣으면 안되나요?

답변1

이것은 문서화되어 있습니다.우분투 위키에서. 이는 패키지의 종속성 수를 줄이기 위해 기본적으로 설정되지만, 발견한 바와 같이 이는 라이브러리의 순서가 중요하다는 것을 의미합니다. 즉, 모든 유형의 객체가 존재하는지 확인해야 합니다.앞으로그들이 사용하는 도서관.

를 사용하여 이 기능을 비활성화할 수 있습니다 --no-as-needed.

관련 정보