【问题标题】:How does llvm-ld locate libstdc++llvm-ld如何定位libstdc++
【发布时间】:2023-12-17 00:14:01
【问题描述】:

小问题llvm-ld如何定位libstdc++

详情

我收到以下错误消息:

llvm-ld: error: Cannot find library 'stdc++'

在运行llvm-ld 时。我试图了解llvm-ld 如何搜索libstdc++

我正在设置一个新系统并遵循在不同系统上工作的编译步骤。最终,我注意到在旧系统上我的.bashrc 中设置的LD_LIBRARY_PATH 有所不同,其中包括大量目录,包括Cadence 和其他杂项软件。我不想使用LD_LIBRARY_PATH,我希望能够通过向llvm-ld 提供适当的命令行参数来链接libstdc++

我正在运行的命令是:

llvm-ld -disable-internalize -native -o foo foo.bc4 -L/usr/lib/x86_64-linux-gnu -lpthread -lrt  -lstdc++ -lm -v

导致以下输出:

  Linking bitcode file 'foo.bc4'
  Linked in file 'foo.bc4'
  Linking archive file '/usr/lib/x86_64-linux-gnu/libpthread.a'
  Linking archive file '/usr/lib/x86_64-linux-gnu/librt.a'
llvm-ld: error: Cannot find library 'stdc++'

但是运行 ls -l /usr/lib/x86_64-linux-gnu/libstdc++* 会导致:

lrwxrwxrwx 1 root root     19 Apr 15 16:34 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 ->    libstdc++.so.6.0.16
-rw-r--r-- 1 root root 962656 Apr 15 16:36 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16

所以我不明白为什么llvm-ld 没有找到这个文件?特别是当我使用 LD_LIBRARY_PATH 集进行编译然后在生成的可执行文件上运行 ldd 时,我得到以下输出:

linux-vdso.so.1 =>  (0x00007ffff7ffe000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ffff7dc1000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ffff7ac0000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ffff77c6000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ffff75b0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff71f0000)
/lib64/ld-linux-x86-64.so.2 (0x0000555555554000)

这似乎表明我想要的libstdc++ 的版本是/usr/lib/x86_64-linux-gnu/libstdc++.so.6,但我不明白为什么llvm-ld 没有通过搜索路径-L/usr/lib/x86_64-linux-gnu 找到它。

供参考:uname -a 结果:Linux FOO 3.2.0-30-generic #48-Ubuntu SMP Fri Aug 24 16:52:48 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

还有llvm-ld --version

LLVM (http://llvm.org/):
  LLVM version 3.1svn
  Optimized build.
  Built Sep 14 2012 (13:22:38).
  Default target: x86_64-unknown-linux-gnu
  Host CPU: core2

【问题讨论】:

  • 看起来llvm-ld 不是在寻找.so.#。文档说它只查找lib${library}.${shared library extension}。您可以尝试创建符号链接/usr/lib/x86_64-linux-gnu/libstdc++.so -> libstdc++.so.6 吗?它应该仍然可以找到版本化的so,不过...
  • 谢谢,创建符号链接可以解决问题。虽然我仍然不明白链接器搜索过程是如何工作的。
  • 如果你man llvm-ld,搜索顺序就在顶部。无论如何,我通常直接与clang 链接,因为它了解我正在寻找的所有 C++ 库。
  • Gabriel 或@Travis,请在下方添加答案。

标签: linux linker llvm ld


【解决方案1】:

看起来llvm-ld 不是在寻找.so.#。根据man页面:

在查找使用-l 选项指定的库时,llvm-ld 首先尝试从当前目录加载具有该名称的文件。如果失败,它会在使用 -L 选项添加到库搜索路径的每个目录中按顺序查找liblibrary.bcliblibrary.aliblibraryshared library extension。这些目录按照指定的顺序进行搜索。如果图书馆不能 定位,然后llvm-ld 查找由LLVM_LIB_SEARCH_PATH 环境变量指定的目录。如果它在那里没有找到库,它就会失败。

您可以通过创建符号链接/usr/lib/x86_64-linux-gnu/libstdc++.so -> libstdc++.so.6 来完成这项工作。

我通常直接与clang 链接,因为它更了解搜索 C++ 库的内容。

【讨论】: