c++ - g++ 链接 RedHat 与 SUSE 期间未解析的符号
问题描述
嗨,我一直在寻找有关链接错误的主题 - 错误:: 未定义对 XXX 的引用,
我的代码在 SUSE 上编译,但不是在 REDHAT 上编译,如果有人能告诉我一些关于这一点的信息,我将不胜感激。我没有找到与我的情况特别匹配的其他帖子(也许我错过了),有一个非常接近的帖子(Linking with dynamic library with dependencies)。我试过了,但我还是碰到了石头。
背景:我有一个使用 parent.cpp 的 child.cpp,所以我在 child.cpp 中包含了 parent.h
parent 中的符号 (XXX) 包含在 libA.so 中
>> nm -C libA.so | egrep XXX
000000000013eb0 T NS::XXX(char const*, char const*, char const*)
还有另一个使用父库的库,我们称之为 libB.so
>> nm -C libB.so | egrep XXX
000000000000000 U NS::XXX(char const*, char const*, char const*)
但 libB.so 有一个指向 libA.so 的链接
>> ldd libB.so | grep libA.so
libB.so => /export/data/NS/lib/libA.so (0x00007fbc0a9bf000)
当我在 SUSE 上链接时,下面会编译
g++ child.cpp -o child -I. -L. -lB
当我在 RHEL 上链接时,它抱怨 undefine XXX,所以我也必须做 libA
g++ child.cpp -o child -I. -L. -lB -lA
我不明白为什么会有差异。我尝试了(Linking with dynamic library with dependencies)中建议的选项。编译时我仍然需要链接 libA。
-Wl,--unresolved-symbols=ignore-in-shared-libs
-Wl,--as-needed
解决方案
推荐阅读
- javascript - 文件上传在我的 Cypress.io 测试中不起作用
- angularjs - 无法在 ubuntu 16 系统中安装 angular 和 node
- c++ - 错误:“float”和“float[0]”类型的无效操作数到二进制“operator*”
- java - 从文件管理器读取文件
- swift - swift UIImagePickerController 并从现有照片中提取 EXIF 数据
- python - 无法查看所有用户输入值
- javascript - 控制器中未收到广播 - angularjs
- android - 在android片段中验证手机号码
- java - 如何在Java中获取for循环的最后一个值?
- windows - 在 Windows 上突出显示或下划线输出到标准输出