라이브러리를 정적으로 링크하도록 gcc에 직접 알리기


133

어떤 라이브러리를 정적으로 연결 하려는지 -Wl,-Bstatic알려면 사용 하기 가 이상합니다 gcc. 결국 gcc라이브러리 ( -Ldir, -llibname) 와의 연결에 대한 다른 모든 정보를 직접 말하고 있습니다 .

어떤 라이브러리를 정적으로 링크해야하는지 gcc 드라이버에 직접 알릴 수 있습니까?

설명 : 특정 라이브러리가 정적 버전에만있는 경우을 사용하지 않고 사용할 수 -Wl,-Bstatic있지만 gcc정적 라이브러리를 선호 한다는 것을 알고 싶습니다 . 또한 라이브러리 파일을 직접 지정하면 해당 파일과 연결될 수 있지만 정적 및 동적 라이브러리를 포함하는 의미를 동일하게 유지하는 것을 선호합니다.

답변:


189

물론 -l:대신 사용할 수 있습니다 -l. 예 -l:libXYZ.a를 들어와 연결합니다 libXYZ.a. 것에 주목 lib반대로, 기입 -lXYZ하는 자동차가 확장 것이다 libXYZ.


63
Gnu만이 lib 접두사 광기 대신 처음에 이것을 기본값으로 설정했다면 하나님. 아, 시간과 좌절은 우리가 구했을 것입니다.
Timmmm

9
Radek,이 -l:옵션은 문서화되어 있습니까? 어떤 버전의 gcc를 사용해야합니까?
osgx

18
실제로 ld링커 sourceware.org/binutils/docs/ld/Options.html " 옵션입니다 -l namespec. namespec 형식이 : filename 형식 인 경우 ld는 파일 이름이라는 파일의 라이브러리 경로를 검색하고 그렇지 않으면 라이브러리를 검색합니다. ELF .. 시스템에서 libnamespec.a. ..라는 파일의 경로를 지정하면 ld는 libnamespec.a ..라는 라이브러리를 검색하기 전에 libnamespec.이라는 라이브러리의 디렉토리를 검색합니다.이 동작은 : filename에는 적용되지 않습니다. 이며 항상 filename이라는 파일을 지정합니다. ". binutils 2.18부터 -sourceware.org/binutils/docs-2.18/ld/Options.html
osgx

17
GNU는이 인터페이스를 책임지지 않으며 Unix 툴체인에서 상속되었습니다.
akim December

이것은 비 GNU 링커에서는 작동하지 않는 수치입니다. 이상한 링크 플래그 해결 방법없이 정적 라이브러리를 찾기 위해 LDLIBS 및 유사한 구성 옵션을 "강제"하는 좋은 방법입니다.
nneonneo

130

연결 명령에 .a 파일을 추가 할 수 있습니다.

  gcc yourfiles /path/to/library/libLIBRARY.a

그러나 이것은 gcc 드라이버와 대화하는 것이 아니라 ld링커와 같은 옵션 -Wl,anything입니다.

gcc 또는 ld에 지시 -Ldir -lLIBRARY하면 링커가 라이브러리의 정적 및 동적 버전을 모두 확인합니다 (로 프로세스를 볼 수 있음 -Wl,--verbose). 선택된 라이브러리 유형의 순서를 변경하려면 -Wl,-Bstatic및 을 사용할 수 있습니다 -Wl,-Bdynamic. 다음은 gnu LD 매뉴얼 페이지입니다 : http://linux.die.net/man/1/ld

프로그램을 lib1, lib3 동적 및 lib2와 정적으로 링크하려면 다음 gcc 호출을 사용하십시오.

gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3

ld의 기본 설정이 동적 라이브러리 (Linux에 있음)를 사용하는 것으로 가정합니다.


3
짧은 버전 : current로 그렇게 할 수있는 방법이 없습니다 gcc.
Elazar Leibovich

7
Elazar Leibovich gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3는 속임수를 쓴다 .
osgx

13
링커 (및 dyn / static lib 검색)는 링커에 의해 수행되므로 링커 옵션을 사용해야합니다. -l-L링커 옵션도 있습니다.
osgx

3
이 답변이 gcc yourfiles /path/to/library/libLIBRARY.a또는으로 인해 상향 조정 -Wl,-Bstatic되었습니까?
Tor Klingberg

7
@TorKlingberg, 변형 1을 작성 /path/to/library/libLIBRARY.a하려면 전체 경로가 필요하고 변형 2 -Wl,-Bstatic -llib2 -Wl,-Bdynamic는 길고 2 개의 추가 옵션을 추가하고 기본 모드를 Bdynamic으로 가정하고 허용되는 변형 3 -l:libXYZ.a은 짧고 작동합니다. 세 가지 모두 많은 경우에 작동하며 정적 프로그램을 연결할 때 변형 2가 작동하지 않을 수 있습니다. lib의 실제 연결 단계는 내가 이해하는 모든 변형에서 동일합니다.
osgx 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.