按照搜索顺序打印 我查找的搜索路径的方法是什么。
我不确定是否有任何简单地打印完整有效的搜索路径的选项。
但是: 搜索路径由命令行上的 -L选项指定的目录组成,后面是通过链接器脚本中的 SEARCH_DIR("...")指令添加到搜索路径的目录。所以如果你能看到这两个,你就可以算出来,你可以这样做:
-L
SEARCH_DIR("...")
如果你直接调用 ld:
ld
--verbose
如果你通过 gcc链接:
gcc
-v
collect2
-Wl,--verbose
在 Linux 上,可以使用 ldconfig(它维护 ld.so 配置和缓存)打印出 ld.so搜索的目录
ldconfig
ld.so
ldconfig -v 2>/dev/null | grep -v ^$'\t'
ldconfig -v通过链接器(没有前导选项卡)打印出目录搜索,以及在这些目录中找到的共享库(有前导选项卡) ; grep获得这些目录。在我的机器上,这条线会打印出来
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
sse2
最后一个注意事项: 使用 -p代替上面的 -v搜索 ld.so缓存。
-p
您可以通过执行以下命令来实现这一点:
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 的答案是不正确的,因为它们指的是运行时动态链接器搜索的路径(即每当一个程序被执行时) ,这与 我搜索的路径(即每当一个程序被链接时)是不一样的。
这个问题被标记为 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/ [...]
上述 gcc的 -Xlinker选项只是将 -v传递给 ld。然而:
-Xlinker
ld -v
不打印搜索路径。
我在 Linux 上找到的最兼容的 gcc 和 clang 命令(感谢 armando.sano) :
$ gcc -m64 -Xlinker --verbose 2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g' | grep -vE '^$'
如果给定 -m32,它将输出正确的库目录。
-m32
我机器上的例子:
g++ -m64:
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:
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
Library search paths: /usr/lib /usr/local/lib Framework search paths: /Library/Frameworks/ /System/Library/Frameworks/