gpt4 book ai didi

c++ - 如何使用 g++ 静态链接除少数库之外的所有库?

转载 作者:可可西里 更新时间:2023-11-01 18:25:55 27 4
gpt4 key购买 nike

我要求静态链接我的所有库,包括 libstdc++、libc、pthread 等。有一个 omniorb 库我想动态链接。

目前我已经动态链接了所有的库。ldd 显示以下内容

linux-vdso.so.1 =>  (0x00007fff251ff000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f291cc47000)
libomniDynamic4.so.1 (0x00007f291c842000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f291c536000)
libm.so.6 => /lib64/libm.so.6 (0x00007f291c2e0000)
libgomp.so.1 => /usr/lib64/libgomp.so.1 (0x00007f291c0d7000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f291bebf000)
libc.so.6 => /lib64/libc.so.6 (0x00007f291bb66000)
/lib64/ld-linux-x86-64.so.2 (0x00007f291ce63000)
librt.so.1 => /lib64/librt.so.1 (0x00007f291b95d000)
libomniORB4.so.1 (0x00007f291b6aa000)
libomnithread.so.3 (0x00007f291cf35000

我需要 ldd 将 libomniDynamic4.so.1 显示为唯一的动态链接库。

我如何实现这一目标?

最佳答案

试图制作一个在所有发行版上运行的 linux 可执行文件,嗯?祝你好运......但我离题了......

您想查看 -v g++ 的标志输出。它显示了 g++/ld 执行的内部链接命令。具体来说,您需要检查最终链接命令 collect2及其所有论点。然后,您可以指定要链接的 .a 库的确切路径。您还必须追踪所有内容的静态库。我的 libstdc++.a 在 /usr/lib/gcc/x86_64-linux-gnu/4.4/libstdc++.a

提示:我对 Linux 最大的提示是可执行文件的 splinter 状态。为什么我不能在一台机器上编译二进制文件并将其复制到另一台机器上运行!?由于 libc/libstdc++ ABI 不兼容,即使 Ubuntu 发行版分开一个版本也会生成无法在另一个版本上运行的二进制文件

编辑 #1 我只是想补充一下 The script on this page produces a .png of an executables .so dependencies.这在尝试执行您描述的操作时非常有用。

注意 ldd <exename>将列出链下的所有依赖项,而不仅仅是可执行文件的直接依赖项。因此,即使您的可执行文件仅依赖于 omniorb.so,但 omniorb.so 依赖于 libphread.so,ldd的输出会列出。查看 readelf 的联机帮助页仅查找二进制文件的直接依赖项。

另一个需要注意的项目。如果 omniorb.so 依赖于 libstdc++.so,你将别无选择,只能依赖于同一个库。否则 ABI 不兼容会破坏您的代码和 omniorb 代码之间的 RTTI。

关于c++ - 如何使用 g++ 静态链接除少数库之外的所有库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6160677/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com