c++ - 如何从 g++ COLLECT_LTO_WRAPPER 获取信息到 make 生成的 .so 文件中?

标签 c++ makefile g++ aix ruby-c-extension

当我从命令行使用 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)它们?

最佳答案

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

相关文章:

linux - 如何将参数从 makefile 传递到 Linux 内核模块源代码

ubuntu - 无法在 ubuntu 12.04 中安装 g++

c++ - 远程编程和调试

c++ - 尝试在 make 中编译简单的 c++ 程序

c++ - 实现哈希表,insert函数导致 "scope"错误

c++ - 在 make 文件中链接 SDL_image

recursion - GNU Make 全局变量在子 make 中更新

c++ - 如何简化检查一对数字是(1,2)还是(2,1)?

c++ - 下面的 trie 代码中发生了什么

c++ - 字节顺序转换和 g++ 警告