当我从命令行使用g++编译c++程序然后执行ldd a.out ldd 时,能够找到libstdc++。a(libstdc++。so.6)

当我构建C++ ruby 扩展时ldd myext.so 无法找不到libstdc++。a(libstdc++。so.6),并且require 'myext'无法加载,并抱怨找不到libstdc++。

如果我运行g++ -v,则会看到以下输出:

COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/big_long_path....
Target: powerpc-ibm-aix7.1.0.0
Configured with: ../gcc-4.8.2/configure .....
Thread model: aix
gcc version 4.8.2 (GCC)

现在,如果我将LIBPATH设置为包含该big_long_path
export LIBPATH=/big_long_path....:$LIBPATH

ldd myext.so

能够找到libstdc++,并且我的require 'myext'可以正常工作(返回true)

这可能没问题,但我宁愿不必让用户对其LIBPATH感到厌烦。是否可以添加到Makefile中,以使生成的myext.so在运行g++ -v时看到的COLLECT_LTO_WRAPPER行中看到的big_long_path所指向的位置中找到libstdc++(和libgcc)?

更新资料

下面接受的答案中的第一个链接确实帮助我理解了所发生的情况,并且通过在Makefile的LDFLAGS中添加-blibpath:big_long_path:/ usr:/ usr / lib,我可以使自己不抱怨libstdc++。

但是由于某种原因,当ruby尝试加载ext时,它仍然失败。这使我认为ruby正在某种程度上调整LIBPATH。最后,我的解决方案是在ruby安装的lib目录中放置一个指向libstdc++和libgcc_s的符号链接(symbolic link)。当时的想法是ruby必须搜索扩展共享对象,因此我想利用这一点并将这两个库放在ruby必须搜索的路径中。我唯一想知道的是,是否只复制libstdc++和libgcc_s而不是符号链接(symbolic link)它们?

最佳答案

看来您建立了自己的gcc。

This is a known issue that gcc does not pass -rpath to the linker to specify the locations of libstdc++ and libgcc_s

您要么需要将该路径手动传递给链接器,要么传递给configure your own gcc to do that for you via specs file

关于c++ - 如何从g++ COLLECT_LTO_WRAPPER获取信息到make生成的.so文件中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34793446/

10-11 23:01
查看更多