从源头“制作”是否使其自成一体?

时间:2017-01-21 05:35:27

标签: makefile build cmake

在我开始之前请原谅我,因为我不是一个C / C ++等程序员,仅仅是一个PHP :)但我一直在研究那些使用其他来自在线开源repos的项目,比如svn和饭桶。对于其中一些项目,我需要安装库然后运行“./configure”,“make”然后“make all”(作为示例),我在“构建”虚拟机上执行此操作以获取二进制文件我需要在我的项目中使用。

我的项目的最终目标是将这些“已编译”(如果这是正确的术语)二进制文件放在虚拟机上然后重新分发(根据许可等)。

我的问题是这样的:当我在我的构建机器上构建这些二进制文件时,我需要所有预先存在的东西来构建它们(“build-essential”和“cmake”和“gcc”)等等 - 一旦二进制文件在我的构建机器上(例如在/ usr / lib中)它们是自包含的,我只能复制构建创建的/ usr / lib二进制文件并将它们放在我将分发的虚拟机上的相同文件夹,没有构建服务器上是否安装了所有构建组件?

我需要在这个位置构建源所需的所有依赖项,最终构建的二进制文件本身是否包含它们,还是我必须将它们包含在分布式服务器上?

那会有用吗?问题有点过于笼统,也许这完全取决于我正在建设的内容吗?

在几次回复后从原始帖子更新

我将自己分发VM,因为我将构建它们,然后将项目安装在它们上面。因此,我完全了解操作系统和环境。我只是不想用我不需要的不必要的软件“膨胀”它们,因为编译的可执行文件我将放在中的分布式虚拟机上,例如 / usr / local / bin ...

2 个答案:

答案 0 :(得分:2)

这取决于您如何程序链接到它所依赖的库。在大多数情况下,默认设置是链接动态,这意味着您需要在的中分发可执行文件。您可以使用ldd命令查看运行该文件所需的库。

理论上,您可以链接所有静态,这意味着库代码将被编译为可执行文件。因此,可执行文件实际上是自包含的,但静态链接并不总是可行的。这取决于您正在使用的实际库,并且可能需要在构建时使用./configure args。

最后,有些库总是动态链接,例如libc。好处是您分发的机器肯定会有这个库。不好的是这些库的版本可能不同,您可能会遇到ABI不匹配。

简而言之,如果您的项目不是很大并且可以静态链接所有内容,那就这样吧。如果没有,请阅读AppImageDocker

答案 1 :(得分:0)

构建的库和头文件的分发(二进制分发)是一种可行的方式,应该可行。 (我总是在我的项目中这样做。)

您构建的所有库都不必安装到/ usr / lib中。为了保持目标计算机的清洁,您可以将其安装在其他文件夹中,例如,

  • /usr/local/MYLIB/lib/libmylib.so
  • /usr/local/MYLIB/include/mylib.h
  • /usr/local/MYOTHERLIB/lib/libmyotherlib.so
  • /usr/local/MYOTHERLIB/include/libmyotherlib.so

优点:

  1. 安装简便,拆卸方便
  2. 一个子文件夹中的所有文件,没有文件丢失,没有与其他库混合
  3. 缺点:

    1. 加载程序必须知道额外的搜索路径