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 옵션은 골드 링커에도 적용됩니다.

추가 리소스

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.