2011-01-27 38 views
4

我有一个C++程序依赖于相当多的库(一些常见的系统库,如libjpeg,一些未安装系统的个人库)。本程序在机器A(Debian Squeeze)上编译良好。我想在机器B(Ubuntu maveric)和机器C(Arch)上运行该程序。假定两台机器B + C都是极端小型装置。不要指望找到我的程序在那里使用的任何库,如果有任何它们不是相同的版本。Linux独立于共享库的二进制文件

是否有任何程序可以扫描我的程序的所有依赖项(使用ldd或其他)收集所有这些依赖项,并生成一个脚本,告诉二进制文件使用这些文件,并且只有它在任何其他系统上附带的库?

谢谢!

+4

祝你好运;或者,您可以按照约定 –

+1

的方式发送源代码,我不打算“发送”。我想要这个供我自己使用。我有源代码,但重新编译可能是一个真正的痛苦。举一个例子,编译器通常假定使用不同版本的lib是安全的。然而,情况并非总是如此 - 我想100%确定程序在每台机器上都使用EXACT相同的库。 – Joekk3

+1

听起来不像你正在做的那样正确。从源代码构建应该很容易。如果我是你,我会集中精力解决这个问题。 –

回答

2

我不是100%确定我理解你的问题,但似乎你想用你的软件包发布这些库,并且使用LD_LIBRARY_PATH强制链接器在你的发布库目录之前查看其他任何东西。

如果还有更多,我可以修改我的答案,因为我有一些这方面的经验。只是想确定我知道你在问什么。

+0

听起来不错。那工作?编译器(在我的情况下是gcc)是否总是在LD_LIBRARY_PATH中使用libs,比如在/ usr/lib中说libs?此外,如果是这样的话:有没有任何程序可以自动分析ldd -v的输出(应该让我所有的依赖关系?)并将所有库复制到一个目录中? – Joekk3

+1

+1到LD_LIBRARY_PATH解决方案。另一种选择是对所有相关库进行静态构建,并将它们全部链接成一个整体二进制文件。 – gravitron

+0

Joekk,没错。顺序是rpaths(lib目录烘焙到可执行文件请求它),LD_LIBRARY_PATH,然后是/etc/ld.so.conf中的默认路径。查看http://linux.die.net/man/8/ld-linux了解更多详情。 –

2

原来你的问题的答案是静态链接,用g ++ -static说。

+0

+1,前提是您将静态构建隔离为释放模式,并且不存在于调试/开发模式。 –

+0

调试和发布之间唯一的区别是-strip。 – Joshua

+0

然后我会说,如果你包含标准库以外的东西,这对于构建时间需要更长时间的事实很愚蠢。 –