当我从命令行使用 g++ 编译一个 c++ 程序然后执行 ldd a.out
ldd 是 能够找到 libstdc++.a(libstdc++.so.6 )
当我构建一个 C++ ruby 扩展时 ldd myext.so
无法 找到 libstdc++.a(libstdc++.so.6),并且 需要 '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'
工作(返回真)
这可能没问题,但我不想让用户弄乱他们的 LIBPATH。有没有我可以添加到我的 Makefile 的东西,允许生成的 myext.so 在我在运行 g++ -v 时看到的 COLLECT_LTO_WRAPPER 行中看到的 big_long_path 指向的位置找到 libstdc++(和 libgcc)?
更新
下面接受的答案中的第一个链接确实帮助我理解了发生了什么,并且通过将 -blibpath:big_long_path:/usr:/usr/lib 添加到 LDFLAGS 中,我能够让 ldd 不提示 libstdc++生成文件。
但出于某种原因,当 ruby 尝试加载 ext 时,它仍然失败。这让我觉得 ruby 正在以某种方式调整 LIBPATH。最后,我的解决方案是在 ruby 安装的 lib 目录中放置一个指向 libstdc++ 和 libgcc_s 的符号链接(symbolic link)。我的想法是 ruby 必须需要搜索扩展共享对象,所以我想我会利用这一点并将这两个库放在 ruby 必须搜索的路径中。我唯一想知道的是我是否应该只复制 libstdc++ 和 libgcc_s 而不是符号链接(symbolic link)它们?
最佳答案
看起来你构建了自己的 gcc。
您要么需要将该路径手动传递给链接器,要么 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/