简短的问题 : llvm-ld
如何定位libstdc++
?
详情 :
我收到以下错误信息:
llvm-ld: error: Cannot find library 'stdc++'
同时运行llvm-ld
。 我想了解如何llvm-ld
searchlibstdc++
。
我正在build立一个新的系统,并遵循在不同系统上工作的编译步骤。 最后,我注意到与旧系统上的.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
没有find它的searchpath-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.#
。 根据man
页:
当查找使用
-l
选项指定的库时,llvm-ld
首先尝试从当前目录加载具有该名称的文件。 如果失败,它会查找liblibrary.bc
,liblibrary.a
或liblibrary
。shared library extension
,依次在每个添加到库搜索路径的目录中使用-L选项。 这些目录按照它们指定的顺序进行搜索。 如果找不到该库,则llvm-ld
将查找由LLVM_LIB_SEARCH_PATH
环境变量指定的目录。 如果它没有在那里找到一个库,它会失败。
你可以通过创建符号链接/usr/lib/x86_64-linux-gnu/libstdc++.so
– > libstdc++.so.6
来完成这项工作。
我通常直接与clang
链接,因为它理解更好地搜索C ++库的东西。