c++ - 与静态 libstd 链接时的唯一全局符号
问题描述
我正在为另一个系统构建一个共享库。我想让它作为静态链接,包括所有的 libstdc 和 libstdc++,所以我可以在另一个较旧的 linux 上按原样使用它。但是,当我将它与以下选项链接时:
/app/localstorage/dev/gcc/4.8.5/bin/g++ -fPIC -static-libgcc -static-libstdc++ -fno-gnu-unique -shared -Wl,-soname,libsgxstconnector.so -o libsgxstconnector.so one.o two.o -ldl -lrt
在较旧的 linux 上,我无法加载库。错误消息指出
libsgxstconnector.so: undefined symbol: _ZNSt8messagesIcE2idE
旧服务器上的 nm -a 显示:
0000000000411c20 ? _ZNSt8messagesIcE2idE
这个 ?flag 表示 ld 不知道它,这可能是它无法加载的原因。在我的构建 linux 上,它显示它是一个唯一的全局符号(标志 u)
0000000000411c20 u _ZNSt8messagesIcE2idE
因此问题是:是否有可能从我的链接库中消除此功能?是否有任何好的做法来构建与 linux 无关的二进制文件?也许 -fno-gnu-unique 应该在不同的地方?
ldd 输出在所有系统上都是相同的:
linux-vdso.so.1 => (0x00007ffd23dac000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fed7ce12000)
librt.so.1 => /lib64/librt.so.1 (0x00007fed7cc09000)
libm.so.6 => /lib64/libm.so.6 (0x00007fed7c985000)
libc.so.6 => /lib64/libc.so.6 (0x00007fed7c5f1000)
/lib64/ld-linux-x86-64.so.2 (0x00000030c4800000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fed7c3d3000)
解决方案
推荐阅读
- amazon-web-services - AWS PrivateLink 终端节点 IP 地址可以更改吗?
- javascript - 如何使用 Azure CI/CD Pipeline 将 Ember.js 应用程序正确部署到 Azure 应用程序服务?
- excel - 在 Excel 中,有没有办法使用“索引匹配匹配”在多个工作表上查找一个值,然后粘贴所需工作表中的值?
- python - 尝试使用 PySpark 读取 MySQL 表时出错
- python - 我安装了 python 3.9,我使用 pip 安装的所有库在 jupyter notebook 中都不起作用
- java - 使用 Java 查找嵌套的 XPATH 引用
- javascript - 函数在使用 sqlite3 时不断返回“Promise { undefined }”
- python - ValueError: list.remove(x): x not in list in pygame
- r - Youtube 视频在 R-markdown 中显示为黑框,2021 年 8 月
- java - 递归创建具有二项式系数的树