是否有一种很好的跨平台方式来使用 CMake 包含外部 C++ 库?

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

我是 cmake 的新手,但到目前为止,我很喜欢它在我的测试项目中的使用,迫不及待地想在我的下一个实际项目中使用它。

我想开始将 cmake 与外部库(接口、pdf、json 库等)一起使用,但我对执行此操作的最佳方法感到有点困惑,该方法仍然允许项目跨平台。

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

是要求用户将编译后的wxWidgets文件包含在源目录中,然后指向CMakeLists.txt文件中的那个更好,还是要求他们设置一个系统更好?指向wxWidgets安装目录的变量,然后指向CMakeLists.txt文件中的that?有没有办法包含一个自动库构建命令,我可以只包含大量的 wxWidgets 源代码?或者还有其他我完全忽略的解决方案吗?

以上所有可能都以某种形式工作,但随着 CMake 的广泛使用,我很好奇大多数人会如何处理它。

这个问题在 google 搜索中很难用短语表达,如果已经有人问过,我们深表歉意。

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

 cmake . -DCMAKE_PREFIX_PATH="<WxWidgetsRoot>"

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

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

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