2012-02-17 55 views
8

我们正在Linux下构建一个可在特定Ubuntu版本内工作的程序。但是我们想要在Ubuntu 10.04和11.10上运行相同的二进制文件。 完全可以在10.04平台上构建应用程序。但是当我这样做时,我依赖于特定的库版本(例如libboost_thread.so.1.40.0),这些版本在11.10上并不易于使用,因为它使用了更新的版本。该系统使用QMake构建。为各种Ubuntu版本编译C++

我正在寻找一个教程或起点如何解决这些多个Ubuntu平台的依赖冲突。

+1

很好的问题,你可以静态链接或发布库与应用程序,并有一个启动器/包装修改LD_LIBRARY_PATH。但我希望有人能提出更好的答案。 – 2012-02-17 13:55:17

+0

如果所有1.x.x都是二进制兼容的,是否可以链接到例如libboost_thread.so.1?我不确定这个特定的库,但有些版本是这样的。 – rasmus 2012-02-17 14:03:16

+0

@rasmus,Googling我从2009年发现邮件列表中说,“根本没有二进制兼容性保证,恐怕。”显然可能有巧合的二进制兼容性,但不能保证,应用程序应该链接到确切的版本。 – 2012-02-17 14:07:27

回答

3

如果没有人觉得在这个摆动,我可能会注入一些东西。

我打算做一些假设。

  • 要分发二进制/闭源应用
  • 你想自己分发

因此排除整个“只是让发行/用户构建它自己设置自己”。

看看其他人如何解决类似的问题,我可以看到,通常将共享库包含在应用程序中,然后使用加载器/包装器,你想要调用它,在启动之前修改环境的脚本应用。具体而言,他们修改LD_LIBRARY_PATH以包含应用程序附带的/ lib文件夹。

该脚本可以像。

#!/bin/sh 

LD_LIBRARY_PATH=./lib ./myAppReal 

这就是我如何解决分发的Qt4应用程序对用户有发行不超过Qt的3.3.6出货较新的(2009年......严重)。用户可能也会说用户是指公司为开发人员付费的5人,但我们认为规范失败并不是要求他们在现代操作系统上跨平台时更加具体。

现在有人可能会发现大约十几件事情是错误的,但这很好,我可以随时更新和学习。

编辑:正如JimR所说,这带来了安全隐患,如果你让libs文件夹世界变得可写,某人可能会用它将恶意代码注入到你的应用程序中。根据您计划部署的方式,它可能不是真正的问题,但您应该意识到这一点。

+0

你的lib文件夹有多大? – rasmus 2012-02-17 14:28:11

+0

如果使用此方法,请确保仔细考虑添加到LD_LIBRARY_PATH的库目录的权限。如果库可以注入到代码中,您正在设置安全问题。 – JimR 2012-02-17 15:18:38

+0

@rasmus,我其实不记得,QtGui是什么? 11MB? – 2012-02-17 16:27:20