답변:
다음 명령을 실행하여이를 수행 할 수 있습니다.
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에서 읽습니다. 그런 다음 링커는 기본 sse2
CPU 검색 경로에서 추가 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
경로 를 제외하거나 무시하는 간단한 방법이 있습니까?