2011-05-28 50 views
6

我有一个要求,我静态链接所有我的库,包括libstdC++,libc,pthread等。有一个omniorb库,我想要动态链接。如何静态链接除使用g ++的几个库之外的所有库?

目前我已动态链接所有库。 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作为唯一的动态链接库。

我该如何做到这一点?

回答

-4

链接时,在指定要静态链接到的库之前使用-static,并在要动态链接的库之前使用-dynamic。您应该结束了一个命令行看起来像这样:

g++ <other options here> -dynamic -lomniDynamic4 -static -lpthread -lm -lgomp <etc> 

当然,你需要要链接静态(杜)的库。一个版本。

+6

此答案*完全*错误: - 静态关闭 - 动态,反之亦然。最后一个胜利。 – 2011-05-31 03:40:13

10

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

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

rant on:我对linux最大的抱怨是可执行文件的断开状态。为什么不能在一台机器上编译一个二进制文件并将其复制到另一台机器上并运行它!?即使是Ubuntu的发行版,一个版本除了会产生一种不能被另由于libc中运行的二进制文件/的libstdC++ ABI兼容性能

编辑#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++,那么你将别无选择,只能依赖于同一个lib。否则,ABI不兼容将会破坏您的代码和omniorb的代码之间的RTTI。

+1

令人沮丧的是,我没有足够的代表评论任何人的帖子。但我想问一下@EmployedRussian为什么“大部分是静态的”二进制文件不是更便携的。为什么相反呢?我已经能够产生无法在没有“大部分静态”路线的情况下运行的二进制文件...。 – 2011-05-31 03:52:49

+1

您现在有必要在各处发表评论。请明智地使用你新获得的力量。 – sbi 2011-05-31 10:05:25

6

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

那就是不可能

首先,ldd总是显示ld-linux-x86-64.so.2任何(x86_64)二进制需要动态链接。如果你使用动态链接(你会用libomniDynamic4.so.1),那么你得到ld-linux-x86-64.so.2

其次,linux-vdso.so.1被内核“注入”进程。你不能摆脱那个。

接下来,问题是为什么你想尽量减少动态库的使用。最常见的原因通常是错误地认为“大多数是静态的”二进制文件更加便携,并且会运行在更多的系统上。在Linux上,这与真的相反。

如果实际上您试图实现便携式二进制文件,则存在多种方法。迄今为止最好的(以我的经验)一直使用apgcc

+3

你能否详细说明你的评论“*最常见的原因通常是错误地认为”大多数是静态的“二进制文件不是更具可移植性,并且可以运行在更多的系统上,在Linux上这与真的相反。如果没有“大部分静态”路线,就能够生成无法在其他机器上运行的二进制文件... – 2011-05-31 11:09:57