有没有一种很好的跨平台方法可以使用CMake包含外部C++库

Is there a good cross-platform way to include external C++ libraries using CMake?

本文关键字:CMake 可以使 包含外 C++ 方法 跨平台 一种 很好 有没有      更新时间:2023-10-16

我对cmake还很陌生,但到目前为止,我很喜欢我的测试项目,迫不及待地想在下一个真正的项目中使用它。

我想开始将cmake与外部库(接口、pdf、json库等)一起使用,但我有点困惑于这样做的最佳方式,即仍然允许项目跨平台。

例如,让我们使用像wxWidgets这样的库,它需要在每个系统的基础上进行编译(我知道wxWidget有一个cmake命令,但我只是将其用作示例)。

最好要求用户将编译后的wxWidgets文件包括在源目录中,然后指向CMakeLists.txt文件中的文件,还是最好要求用户设置一个指向wxWidget安装目录的系统变量,然后指向CMakeLists.txt文件中的?有没有一种方法可以包括一个自动化的库构建命令,我可以只包括大量的wxWidgets源代码?还是还有另一个我完全忽略的解决方案?

以上所有内容都可能以某种形式发挥作用,但随着CMake的广泛使用,我很好奇大多数人会如何处理这一问题。

这是一个很难在谷歌搜索中表达的问题,如果已经有人问过了,很抱歉。

正如您所说,许多库在CMake中已经有了一个模块,允许CMake定位它们的文件。如果是这种情况,他们通常只需要找到包含外部库的"根"目录。这就是CMAKE_PREFIX_PATH变量的原因,该变量经常在命令行中指定。例如:

cmake . -DCMAKE_PREFIX_PATH="<WxWidgetsRoot>"

在许多系统(*nix和OSX)上,库和头文件都安装在系统路径中,CMake会自动定位这些文件,因为默认情况下会搜索这些路径。在Windows系统上,通常使用CMAKE_PREFIX_PATH

如果您的外部项目没有一个CMake脚本来定位其头/库,那么您可以通过创建一个Find<package>.cmake文件并将其放入CMAKE_MODULE_PATH中来自己编写它。有关详细说明,请参阅此处。

至于项目依赖关系的分布,这完全取决于您。a)要求用户手动获取它们,b)通过脚本下载它们,c)从您自己的源代码管理(例如git子模块)获取它们中的任何一种都是可能的选择,而且可能还有更多。