当我从命令行使用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_pathexport 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/