【问题标题】:Compile C++ project with all dependencies into a single binary file将具有所有依赖项的 C++ 项目编译为单个二进制文件
【发布时间】:2021-11-03 02:47:54
【问题描述】:

我有一个 C++ 项目,我想将它编译成一个包含所有共享库、第三方等的二进制文件。 我想将编译后的文件移动到不同的服务器而不安装任何依赖项。这就是为什么我需要一个一体化/捆绑的二进制文件。

例如,我试图编译这个:

g++ sample.cpp -o sample -Wl,-Bstatic -l:libyaml-cpp.so

但是我得到了这个错误,而我在/usr/lib 目录中确实有libyaml-cpp.so 文件:

/usr/bin/ld: attempted static link of dynamic object `/usr/lib/gcc/x86_64-pc-linux-gnu/11.1.0/../../../../lib/libyaml-cpp.so'
collect2: error: ld returned 1 exit status

解决问题的最佳方法是什么?通常在 GNU/Linux 平台上拥有一个包含所有依赖项的编译文件?

【问题讨论】:

  • 或许g++ sample.cpp -o sample -static -lyaml-cpp?
  • @HolyBlackCat 它显示错误:/usr/bin/ld: cannot find -lyaml-cpp
  • 您是从包管理器安装 yaml-cpp 还是自己构建的?
  • @HolyBlackCat 是的,我已经做到了。
  • 什么“是”?你自己建的吗?或者你是从包管理器安装的吗?如果是后者,这个包是如何调用的,你使用的是什么 linux 发行版?

标签: c++ linux gcc


【解决方案1】:

通常你会使用g++ sample.cpp -o sample -static -lyaml-cpp

但似乎 Arch 倾向于不在其包中包含静态库。您的选择是:

  • 自己构建 yaml-cpp 以获得静态库。

  • 将动态库与您的可执行文件一起分发。

    为避免将其安装在系统目录中,您可以执行以下操作之一:

    • 在运行程序时将LD_LIBRARY_PATH 环境变量设置为.so 的位置。

    • -Wl,-rpath='$ORIGIN' 添加到链接器标志,然后生成的二进制文件将在检查系统目录之前自动尝试从其目录加载库。

      您还可以使用patchelf 修改现有可执行文件和共享库中的 rpath。当您想要包含其他共享库所依赖的共享库并且后者未使用 -Wl,-rpath='$ORIGIN' 编译时,这很有用。

【讨论】:

    【解决方案2】:

    您明确要求链接到共享对象 (.so)!

    -l:libyaml-cpp.so
    

    您说您的链接器找不到-lyaml-cpp,所以您似乎缺少必要的文件;通常情况并非如此; libyaml-cpp 的开发文件的安装应该包含必要的文件。

    【讨论】:

      【解决方案3】:

      一般来说,有两种方法可以确保您的程序只包含一个(可执行)文件:

      静态链接

      您可以编译单个二进制文件,前提是您可以访问所有依赖项的静态库(通常命名为 lib*.a)。链接程序时,静态库的行为与普通目标文件非常相似。请注意,您的问题明确提到了动态库 (lib*.so),这是另一种编译为从文件加载的库。

      注意 glibc does not like 是静态链接的,may not support it at all

      将共享对象作为资源嵌入

      或者,您可以将共享对象(和其他资源)嵌入到您的可执行文件中并解压缩以执行。这可以通过多种方式完成(想想自解压 zip 档案、以字节数组形式存储在全局变量中的文件、this question may get you started)。

      然后,您必须将共享库转储到文件中(例如,在 tempfs 中)并dlopen 它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多