【问题标题】:make install vs. inplace linking进行安装与就地链接
【发布时间】:2026-01-09 07:20:05
【问题描述】:

当以拓扑排序的顺序构建多重依赖的 C++ CMake 项目(在 Linux 中)时,我们有两种可能性:

浏览每个项目,然后...

  1. ... 在某个前缀中“进行安装”。在项目中构建库时,链接到已安装的库

  2. ...通过“make”构建它,不要安装。在项目中构建库时,链接到已就地构建的库

这些选择的优缺点是什么?由自制脚本执行的构建,它解决依赖关系、按正确的顺序构建等。

【问题讨论】:

    标签: c++ linux makefile cmake build-system


    【解决方案1】:

    当然,你可以两者兼得。但是“安装”的想法是将库、头文件、文档等放置在一个定义明确的目录中,这不依赖于源代码树的布局。

    单独的源代码,通常只有那个包的程序员才感兴趣,编译的程序库等,这对用户和其他包的程序员来说很有趣。

    假设您必须更改一个子包的目录结构。如果不安装,您将不得不调整所有其他 man 脚本。

    所以:

    解决方案 1 的优点(== 解决方案 2 的缺点)

    • 整个包的可维护性更好
    • “预期”的方式

    【讨论】:

    • 谢谢,我更喜欢使用“make install”的解决方案,因为它是“标准方式”——你可以区分构建系统的内部实现细节和它实际构建的内容——这样更灵活。
    【解决方案2】:

    makemake install 预计会执行两个概念上不同的事情。他们没有更好或更坏。我将通过使用make(来自“Unix 编程艺术”)描述通常的程序安装顺序来解释:

    • ma​​ke (all) - 您的 all 产品应该使您的项目的每个可执行文件。通常 all 产生式没有明确的规则;相反,它指的是你所有的 项目的*目标(并且,并非偶然地记录了这些目标是什么)。 按照惯例,这应该是您的 makefile 中的第一个产品,因此它将 是在开发者类型 make 没有参数时执行的。

    • ma​​ke test - 运行程序的自动化测试套件,通常由一组单元组成 测试以发现回归、错误或与预期行为的其他偏差 在开发过程中。也可以使用“测试”产品 由软件的最终用户确保其安装正常运行 正确。

    • ma​​ke install - 在系统目录中安装项目的可执行文件和文档,以便 一般用户可以访问它们(这通常需要 root 权限)。 初始化或更新可执行文件所需的任何数据库或库 为了发挥作用。

    感谢 Eric Steven Raymond 的回答

    【讨论】: