如何根据libstdc ++库安装程序

我的程序是用C ++编写的,在Ubuntu 9.10 64位上使用GCC。 如果依赖于/usr/lib64/libstdc++.so.6这实际上指向/usr/lib64/libstdc++.so.6.0.13。 现在我将这个程序复制到处女的Ubuntu 7.04系统,并尝试运行它。 它没有按预期运行。 然后我添加到程序目录下面的文件:

  • 的libstdc ++。so.6.0.13
  • libstdc ++。so.6(指向libstdc ++。so.6.0.13的链接)

执行命令:

LD_LIBRARY_PATH=. ./myprogram 

现在一切正常。 问题:如何编写这样的程序的安装脚本? myprogram文件本身应该放在/ usr / local / bin。 我能用依赖关系做些什么? 例如,在目标计算机上,/usr/lib64/libstdc++.so.6链接指向/usr/lib64/libstdc++.so.6.0.8。 我能用这个做什么?

注意:程序是封闭的,我不能提供源代码和makefile。

如果你在Ubuntu上工作,制作一个.deb( Debian Package )似乎要走了。 这里是一个链接,让你开始。

你的软件包将声明它取决于一些其他软件包(通常是包含libstdc++.so.6.0.13的软件包 – 我猜软件包名称是类似于libstdc++ ),当你用dpkg -i <yourpackage>.deb

之后,您可以使用dpkg -r <yourpackage>将其卸载。

无论如何,请不要将这些标准文件与自己的档案一起发送。 存在这种确切目的的依赖关系。

希望能帮助到你。

真正的问题是,你试图安装一个二进制文件,使用Ubuntu 9.10上可用的新版本。 最好的选择应该是为旧的Ubuntu 7.10制定一个特定的目标,用旧的库(这是一个backport)进行编译。

那么你应该制作两个(或更多).deb包,一个用于Ubuntu 9.10,一个用于Ubuntu 7.10。

另一种可能性是继续做你现在正在做的事情:设置LD_LIBRARY_PATH指向所需的libstdc ++版本和其他必要的库。 您只需在启动器shell脚本中设置此环境变量即可。 在脚本中检查新库是否可用,并且只在需要时设置LB_LIBRARY_PATH(对/ usr / local / lib / myprogram /)。 但正如其他人所指出的:这是一个非常糟糕的做法。 无论如何,不​​要试图将这些提供的库放在Ubuntu 9.10中的标准位置,如果这些库在某一天被正式支持,您将冒着损坏目标系统的风险,并为用户或程序带来更新问题。

但是如果你选择包含你自己的一套系统库,还有另外一种方法可以比上面的方法去做:静态链接这些库。 如果一个程序是图书馆的唯一用户,可能会出现上述情况,那么您将失去使用共享动态库的所有优势,那么为什么还要使用它呢? 而且,与stacically链接库,你将不必安装它们。