16.6. GCC에서 정적 및 동적 library 사용
경우에 따라 일부 라이브러리를 정적 및 일부 동적으로 연결해야 할 수도 있습니다.
사전 요구 사항
소개
GCC 는 동적 라이브러리와 정적 라이브러리를 모두 인식합니다. l foo
옵션이 나오면 gcc 는 먼저 foo 라이브러리의 동적으로 연결된 버전이 포함된 공유 오브젝트(a .so
파일)를 찾은 다음, 정적 버전의 라이브러리를 포함하는 아카이브 파일(.a
)을 찾습니다. 따라서 다음과 같은 상황이 발생할 수 있습니다.
- 공유 오브젝트만 찾을 수 있으며 이에 대한 gcc 링크
- 해당 아카이브만 발견되고 이에 대한 gcc 링크만 정적으로 표시됩니다.
- 공유 오브젝트와 아카이브가 모두 있습니다. gcc 는 공유 오브젝트에 대한 기본 동적 링크를 선택합니다.
- 공유 오브젝트 또는 아카이브를 찾을 수 없으며 연결이 실패합니다.
이러한 규칙으로 인해 연결할 라이브러리의 정적 또는 동적 버전을 선택하는 가장 좋은 방법은 gcc 에서 해당 버전만 찾는 것입니다. -L경로
옵션을 지정할 때 라이브러리 버전이 포함된 디렉토리를 사용하거나 그대로 두어 어느 정도까지 제어할 수 있습니다.
또한 동적 연결이 기본값이기 때문에 연결을 명시적으로 지정해야 하는 유일한 상황은 두 버전이 있는 라이브러리를 정적으로 연결해야 합니다. 두 가지 가능한 솔루션이 있습니다.
-
l
옵션
대신 파일 경로로 정적 라이브러리 지정 -
옵션을 링크에 전달하려면
-Wl
옵션을 사용합니다.
파일을 기준으로 정적 라이브러리 지정
일반적으로 gcc 는 -l
foo옵션을 사용하여 foo 라이브러리에 연결하도록 지시됩니다. 그러나 라이브러리가 포함된 libfoo.a
파일에 대한 전체 경로를 지정할 수 있습니다.
$ gcc ... path/to/libfoo.a ...
파일 확장자 에서
gcc 는 이것이 프로그램과 연결할 라이브러리임을 이해할 것입니다. 그러나 라이브러리 파일의 전체 경로를 지정하는 것은 덜 유연한 방법입니다.
W l 옵션
사용
gcc 옵션 -Wl
은 옵션을 기본 링커에 전달하는 특수 옵션입니다. 이 옵션의 구문은 다른 gcc 옵션과 다릅니다. -Wl 옵션 뒤에 쉼표로 구분된 링커 옵션 목록이 오는 반면, 다른 gcc 옵션에는 공백으로 구분된 옵션 목록이 필요합니다. gcc 에서 사용하는 ld 링커는 이 옵션 뒤에 있는 라이브러리를 각각 정적으로 또는 동적으로 연결해야 하는지를 지정하기 위해 -Bstatic
및 -Bdynamic
옵션을 제공합니다. B static과 라이브러리를 링커에 전달한 후에는 다음 라이브러리가
옵션과 동적으로 연결되도록 기본 동적 연결 동작을 수동으로 복원해야 합니다.
-B
dynamic
프로그램을 연결하려면 먼저 라이브러리를 정적으로 연결(libfirst.a
) 및 두 번째 동적으로 연결(lib second.so
), 다음을 실행합니다.
$ gcc ... -Wl,-Bstatic -lfirst -Wl,-Bdynamic -lsecond ...
gcc 는 기본 ld 이외의 링커를 사용하도록 구성할 수 있습니다. -Wl
옵션은 골드 링커에도 적용됩니다.
추가 리소스
- GCC(GNU Compiler Collection) 사용 - 링크용 3.15 옵션
- binutils 2.32 - 2.1 명령줄 옵션설명서