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

时间:2010-04-27 09:05:48

标签: c++ linux installation shared-libraries

我的程序是用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。

2 个答案:

答案 0 :(得分:3)

如果您正在使用Ubuntu,那么制作.deb( Debian软件包)就好了。 Here是一个帮助您入门的链接。

您的软件包将声明它取决于其他一些软件包(通常是包含libstdc++.so.6.0.13的软件包 - 我猜包名称类似于libstdc++),并且在安装自己的软件包时将安装依赖项使用dpkg -i <yourpackage>.deb

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

无论如何,从不使用拥有存档发送此类标准文件。依赖性存在于此目的。

希望它有所帮助。

答案 1 :(得分:1)

真正的问题是你尝试安装一个使用Ubuntu 9.10上可用的公共库的新版本的二进制文件。最好的选择应该是为旧的Ubuntu 7.10创建一个特定的目标,用旧的库(这是一个反向端口)编译它。

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

另一种可能性是继续执行您现在正在执行的操作:将LD_LIBRARY_PATH设置为指向所需版本的libstdc ++和其他必需的库。您只需在启动程序shell脚本中设置此环境变量。在脚本中,检查新库是否可用,并且仅在需要时设置LB_LIBRARY_PATH(比如说/ usr / local / lib / myprogram /)。但正如其他人的海报所指出的那样:这是一种非常糟糕的做法。无论如何,永远不要试图将这些提供的库放在Ubuntu 9.10中的标准位置,如果这些库有一天被正式向后移植,您将冒险破坏目标系统并导致用户或程序出现更新问题。

但是如果你选择包含你自己的一套系统库,还有另一种方法可以比上面那样:只需静态链接这些库。如果一个程序是库的唯一用户,因为它可能在上面的场景中,你将失去使用共享动态库的所有优点,那么为什么还要使用它呢?使用stacically链接库,您不必安装它们。