답변:
다음 명령을 실행하여이를 수행 할 수 있습니다.
ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012
gcc 는 몇 가지 추가 -L 경로를 링커에 전달합니다. 링커는 다음 명령으로 나열 할 수 있습니다.
gcc -print-search-dirs | sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/\.\./,/,;t 1;s,:[^=]*=,:;,;s,;,; ,g' | tr \; \\012
그들이 참조 때문에 경로는 경로가 검색과 동일하지 런타임 동적 링커 (즉, 프로그램이 실행될 때마다)로 검색에 사용 ld.so.conf 때문에 ldconfig을 제안하는 응답이 올바르지 LD (즉마다 프로그램이 연결되어 있습니다).
ld검색 경로 를 재정의하는 글로벌 방법을 의미했습니다 . 예를 들어 때때로 나는에서 소스 코드를 컴파일해야 makefile또는 생성 메이크 파일을 configure스크립트 나에서 CMakeLists.txt나 같은 더 복잡한 것들 vala이나 srt. ld이런 경우 검색 경로 를 수정하기가 어렵습니다
리눅스에서, 당신은 사용할 수있는 ldconfig디렉토리에 의해 검색 인쇄하려면 ld.so 구성 및 캐시를 유지하는, ld.so와
ldconfig -v 2>/dev/null | grep -v ^$'\t'
ldconfig -v링커 (리딩 탭 없음) 및 해당 디렉토리에있는 공유 라이브러리 (리딩 탭 있음)가 검색 한 디렉토리를 인쇄합니다. 는 grep디렉토리를 가져옵니다. 내 컴퓨터 에서이 줄이 인쇄됩니다.
/usr/lib64/atlas:
/usr/lib/llvm:
/usr/lib64/llvm:
/usr/lib64/mysql:
/usr/lib64/nvidia:
/usr/lib64/tracker-0.12:
/usr/lib/wine:
/usr/lib64/wine:
/usr/lib64/xulrunner-2:
/lib:
/lib64:
/usr/lib:
/usr/lib64:
/usr/lib64/nvidia/tls: (hwcap: 0x8000000000000000)
/lib/i686: (hwcap: 0x0008000000000000)
/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib/sse2: (hwcap: 0x0000000004000000)
/usr/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib64/sse2: (hwcap: 0x0000000004000000)
hwcap줄에 없는 첫 번째 경로 는 내장되어 있거나 /etc/ld.so.conf에서 읽습니다. 그런 다음 링커는 기본 sse2CPU 검색 경로에서 추가 CPU 기능에 해당하는 이름으로 추가 디렉토리를 검색 할 수 있습니다 . 이 경로 hwcap에는 라인에있는 이러한 CPU 기능에 맞게 조정 된 추가 라이브러리가 포함될 수 있습니다.
마지막 참고 사항 : 위 -p대신 사용 -v하면 ld.so캐시가 대신 검색 됩니다.
export LD_LIBRARY_PATH=/some/other/dir이 명령의 출력에 영향을 미치지 않을 수 있습니까 ?! 100 % 작동하지 않는 것 같습니다.
LD_LIBRARY_PATH디버깅을 가능하게함으로써. 예를 들어 LD_DEBUG=libs /lib/ld-linux.so --list cat(모든 실행 파일을 사용할 수 있으며, 내가 cat생각할 수있는 첫 번째 항목으로 선택 했습니다). " search path"를 grepping 할 가치가 있습니다 . 참고이있는 경우에하는 것이 /etc/ld.so.cache필요한 모든 libs와 일치를, 당신이보고받지 않습니다 내장 된 시스템 검색 경로, 그것은 지금까지 그을받지 않습니다 때문이다.
gcc검색 경로는 다음과 같은?
전체 유효 검색 경로를 단순히 인쇄하기위한 옵션이 있는지 확실하지 않습니다.
그러나 검색 경로는 -L명령 줄의 옵션으로 지정된 디렉토리 SEARCH_DIR("...")와 링커 스크립트의 지시문으로 검색 경로에 추가 된 디렉토리로 구성됩니다 . 따라서 두 가지를 모두 볼 수 있다면 다음과 같이 해결할 수 있습니다.
ld직접 호출하는 경우 :
-L옵션은 그들이 말한대로입니다.--verbose옵션을 추가하십시오 . SEARCH_DIR("...")일반적으로 출력 상단 근처 에서 지시문을 찾으십시오 . (이것은 매번 호출 할 때마다 반드시 동일하지는 않습니다 ld. 링커에는 여러 가지 기본 제공 기본 링커 스크립트가 있으며 다양한 다른 링커 옵션을 기반으로 스크립트를 선택합니다.)를 통해 연결하는 경우 gcc:
-v옵션을 전달할 수 있습니다 gcc. 실제로 일반적으로 ld직접 호출하지는 않지만 collect2(내부 디렉토리 중 하나에있는) 이라는 도구를 통해 간접적으로 호출합니다 ld. -L사용중인 옵션이 표시 됩니다.-Wl,--verbose하여 위에서 설명한 링커 스크립트를 볼 수 있습니다.gcc--verbose-T script스크립트를 사용하면서 ld의 기본 스크립트를 완전히 대체하고 내가 지적한 부분 만 보았습니다.
Linux에서 gcc 및 clang에 대해 가장 호환 가능한 명령은 armando.sano 덕분입니다.
$ gcc -m64 -Xlinker --verbose 2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g' | grep -vE '^$'
을 주면 -m32올바른 라이브러리 디렉토리가 출력됩니다.
내 컴퓨터의 예 :
에 대한 g++ -m64:
/usr/x86_64-linux-gnu/lib64
/usr/i686-linux-gnu/lib64
/usr/local/lib/x86_64-linux-gnu
/usr/local/lib64
/lib/x86_64-linux-gnu
/lib64
/usr/lib/x86_64-linux-gnu
/usr/lib64
/usr/local/lib
/lib
/usr/lib
에 대한 g++ -m32:
/usr/i686-linux-gnu/lib32
/usr/local/lib32
/lib32
/usr/lib32
/usr/local/lib/i386-linux-gnu
/usr/local/lib
/lib/i386-linux-gnu
/lib
/usr/lib/i386-linux-gnu
/usr/lib
문제는 Linux로 태그되어 있지만 Linux에서도 잘 작동합니까?
gcc -Xlinker -v
Mac OS X에서는 다음이 인쇄됩니다.
@(#)PROGRAM:ld PROJECT:ld64-224.1
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 armv6m armv7m armv7em
Library search paths:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/lib
Framework search paths:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/
[...]
위 의 -Xlinker옵션은로 gcc전달 -v됩니다 ld. 하나:
ld -v
검색 경로를 인쇄하지 않습니다.
-Lpath. 따라서 @ Raphaël Londeix 답변이 더 좋습니다.
맥 버전 : $ ld -v 2, 자세한 경로를 얻는 방법을 모른다. 산출
Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/
ld -v 2
ld있습니다. OS X이 GNU를 사용한다고 생각하지 않습니다 . Binutil 사람들은 빌드 스크립트에서이를 비활성화했습니다. 몇 년 동안 비활성화되었습니다.
/usr/local/..누락이 발생하여 연결이 실패합니다./usr/local해당 검색 경로를 제외 하려면 매번 이름을 바꿔야 합니다./usr/local경로 를 제외하거나 무시하는 간단한 방법이 있습니까?