CMake 选项、环境变量和构建选项之间的区别

Difference between CMake options, environment variables and build options

我在我的项目中使用 CLion,并试图更好地了解哪个配置参数的作用。例如,什么对应于代码中的#define 语句,它们是等价的以及何时使用什么。任何人都可以解释一下吗?

我理解你的困惑。让我们试着把事情弄清楚。

我猜您所说的构建选项是指您在调用 CMake 时指定为命令行参数的选项(例如 cmake -DFOO=Bar ..)。这个 will do 是将 CMake 缓存中的变量 FOO 设置为值 Bar。然后 CMake 脚本可以像 CMake 中的任何其他(缓存)变量一样使用它。请注意,缓存变量在 CMake 的不同 运行 之间保持不变。这意味着,除非用户在 运行 之间删除了他们的 CMake 缓存,否则 CMake 将记住之前 运行 中的选项,而用户不必在命令行上重述该选项。但是,每次他们 运行 第一次使用 CMake 时,他们都需要重新声明选项。

CMake 选项的工作方式完全相同,额外的便利是 CMake 知道变量应该由用户事先设置。在命令行上完全没有区别,但如果您的用户使用 ccmakecmake-gui 前端(或了解 CMake 选项的 IDE),该选项将出现在那里。因此,对于您希望由用户设置的变量,不要只是在脚本中使用它们并假装您的用户会知道它们 - 设置适当的 CMake 选项,以便变量在前端显示为构建选项对于用户。

环境变量有不同的用途 - 它们描述环境。与为每个构建单独声明的构建选项不同,环境变量应包含有关永不更改的系统信息。例如,find_package considers environment variables 在系统上搜索依赖项(Package_ROOT,其中 Package 是依赖项的名称)。这是有道理的,因为您很可能只会在系统上安装一个该软件包,然后所有依赖它的项目都会使用该软件包。不必在每个新的 CMake 运行 上重新声明依赖项的位置,只需设置一次环境变量,它就会从那时起正常工作(直到您从其原始位置删除依赖项)。

但是等等,如果我只想为构建项目 X 使用该依赖项的不同安装怎么办?我不想每次构建 X 时都必须更改环境变量,然后又必须将其更改回来... 所以find_package除了环境变量,还要考虑CMake的同名变量。这样,用户仍然可以通过构建特定选项从环境变量覆盖系统范围的设置。所以这两种机制并不相互排斥。

仔细考虑您的用户将如何使用各个选项并相应地选择机制。