如何以搜索顺序打印被ld查找的搜索路径。
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
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功能的其他目录。
这些带有hwcap
的路径可以包含针对这些CPU功能量身定制的附加库。
最后一点说明:使用-p
而不是上面的-v
会搜索ld.so
缓存。
export LD_LIBRARY_PATH=/some/other/dir
,为什么这个命令的输出不会受到影响?!看起来它没有完全生效? - TomasLD_LIBRARY_PATH
的路径。例如。 LD_DEBUG = libs / lib / ld-linux.so --list cat
(您可以使用任何可执行文件,我选择了cat
作为我能想到的第一件事)。值得注意的是,如果您有一个与所有所需库匹配的/etc/ld.so.cache
,则无法看到内置系统搜索路径,因为它不会走那么远。 - John O'M.gcc
的搜索路径和这些路径一样吗? - nn0pldconfig -v
时要小心,它会永久删除所有配置的目录。在FreeBSD上请改用ldconfig -r
。 - rustyx我不确定是否有简单打印完整有效搜索路径的选项。
但是:搜索路径由在命令行上使用 -L
选项指定的目录组成,后面跟着链接脚本中的 SEARCH_DIR("...")
指令添加到搜索路径中的目录。因此,如果你能看到这两个东西,你就可以计算出它了,具体操作如下:
如果你直接调用 ld
:
-L
选项是你所说的选项。--verbose
选项。查找 SEARCH_DIR("...")
指令,通常在输出的顶部附近。(请注意,这些对于每次调用 ld
不一定相同-- 链接器具有许多不同的内置默认链接器脚本,并根据各种其他链接器选项进行选择。)如果通过 gcc
进行链接:
gcc
传递 -v
选项,以便显示它如何调用链接器。实际上,它通常不直接调用 ld
,而是间接地通过一个名为 collect2
的工具(位于其内部目录之一)调用它,然后调用 ld
。这将显示正在使用哪些 -L
选项。gcc
选项中添加 -Wl,--verbose
,使其将 --verbose
传递到链接器,以查看上述描述的链接器脚本。在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
gcc -Xlinker -v
@(#)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
。然而:ld -v
未打印搜索路径。
Mac版本:$ ld -v 2,不知道如何获取详细路径。输出。
Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/
ld -v 2
。 - Jacklynnld
。Binutil的开发者在构建脚本中禁用了它。已经被禁用多年了。 - jww
/usr/local/..
中找到了手动安装的库,导致缺少库错误,链接失败。我必须每次重命名/usr/local
以排除该搜索路径。有没有一种简单的方法来排除或覆盖/usr/local
路径? - kennld
的搜索路径。例如,有时我需要从makefile
编译源代码,或者从configure
脚本或CMakeLists.txt
生成makefile,甚至更复杂的情况,如vala
或srt
。在这些情况下修改ld
搜索路径很困难。 - kenn/usr/local/include
然后是/usr/include
,而链接器搜索顺序为/usr/lib64
然后是/usr/local/lib64
。 - coladict-Lpath
,我看不到gcc -print-search-dirs
输出中的更改? - Филя Усков