【问题标题】:How to install the program depending on libstdc++ library如何根据 libstdc++ 库安装程序
【发布时间】:2011-02-12 18:40:10
【问题描述】:

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

【问题讨论】:

    标签: c++ linux installation shared-libraries


    【解决方案1】:

    如果您在 Ubuntu 上工作,制作一个 .deb(Debian 软件包)似乎是可行的。 Here 是一个帮助您入门的链接。

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

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

    无论如何,永远不要将此类标准文件与您的自己的存档一起提供。为此目的存在依赖项。

    希望对你有帮助。

    【讨论】:

    • 非 Debian Linux 发行版怎么样?
    • @Alex Farber:许多 Linux 发行版都支持 RPM。自解压 bash 档案也是一种选择,尽管使用 deb 或 rpm 等本机系统安装包是更好、更清洁的解决方案
    • @Dmitry Yudakov:确实不错。此外,如果您真的不想手动创建两者,还有一些工具(如 alien)可以将 .rpm 转换为 .deb(以及 .deb 到 .rpm)。
    【解决方案2】:

    真正的问题是您尝试安装一个二进制文件,该二进制文件使用 Ubuntu 9.10 上可用的较新版本的 os 通用库。最好的选择应该是为旧的 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 中的标准位置,如果有一天这些库被正式向后移植,您可能会破坏目标系统并导致用户或您的程序出现更新问题。

    但是,如果您选择包含自己的一组系统库,那么除了上述方法之外,还有另一种方法:只需静态链接这些库。如果一个程序是库的唯一用户,因为它可能在上述情况下,您将失去使用共享动态库的所有优势,那么为什么还要费心使用它呢?使用静态链接库,您无需安装它们。

    【讨论】:

    • 如果库版本确实有问题,他仍然可以使用可用的libstdc++为目标操作系统编译它。除非他需要仅存在于 libstdc++-.6.0.13 中的特定功能:那么是的,使用反向端口是可行的方法。
    • @ereOn:是的,这就是我的建议。但我想知道 OP 问题是否与建筑环境有关,而不是与安装有关。他要么需要一个 Ubuntu 7.10 env 来编译,要么调整它的编译环境设置以编译到 9.10 以外的其他目标。
    猜你喜欢
    • 1970-01-01
    • 2015-02-06
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多