代码之家  ›  专栏  ›  技术社区  ›  Alex F

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

  •  2
  • Alex F  · 技术社区  · 14 年前

    我的程序是用C++编写的,使用GCC在Ubuntu 9.10上64位。if依赖于/usr/lib64/libstdc++.so.6,它实际上指向/usr/lib64/libstdc++.so.6.0.13。现在我把这个程序复制到维珍Ubuntu7.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 回复  |  直到 9 年前
        1
  •  3
  •   ereOn    14 年前

    如果你在ubuntu上工作,做一个.deb( Debian软件包 )看来还不错。 Here 是一个让你开始的链接。

    您的包将声明它依赖于其他一些包(通常包括 libstdc++.so.6.0.13 -我想包裹的名字是 libstdc++ )当您使用 dpkg -i <yourpackage>.deb .

    之后,您可以使用 dpkg -r <yourpackage> .

    不管怎样, 从未 将这些标准文件与 拥有 档案文件。依赖关系就是为了这个目的而存在的。

    希望有帮助。

        2
  •  1
  •   kriss    14 年前

    真正的问题是,你试图安装一个二进制文件,它使用的是ubuntu 9.10上提供的较新版本的os公共库。最好的选择应该是为旧的Ubuntu7.10设置一个特定的目标,并用旧的库(即一个backport)编译它。

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

    另一种可能是继续执行您现在正在执行的操作:将ld_library_path设置为指向所需版本的libstdc++和其他必要的库。您只需在启动程序shell脚本中设置此环境变量。在脚本中,检查新库是否可用,并仅在需要时设置lb_library_路径(例如/usr/local/lib/myprogram/)。但正如其他海报所指出的:这是一个非常糟糕的做法。无论如何,不要试图将这些提供的库放在Ubuntu9.10的标准位置,如果有一天这些库被正式移植,你将冒着破坏目标系统并给用户或你的程序带来更新问题的风险。

    但是,如果选择包含自己的一组系统库,还有另一种方法要做:静态链接这些库。如果程序是库的唯一用户,就像在上面的场景中一样,您将失去使用共享动态库的所有优势,那么为什么还要费心使用它呢?而对于静态链接的库,您不必安装它们。