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

Posted

技术标签:

【中文标题】有没有一种很好的跨平台方法来使用 CMake 包含外部 C++ 库?【英文标题】:Is there a good cross-platform way to include external C++ libraries using CMake? 【发布时间】:2017-10-13 15:20:59 【问题描述】:

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

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

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

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

以上所有方法都可能以某种形式起作用,但是随着 CMake 的广泛使用,我很好奇大多数人会如何处理这个问题。

这是一个在 google 搜索中很难表达的问题,如果已经被问到,请见谅。

【问题讨论】:

Probably related: CMake:How To Find Libraries。虽然我不会称之为“好”的方式。 @VTT 我在发布之前就读过了。它说如果您使用的库未被 cmake 认可,那么您应该在项目子目录中包含必要的文件。这让我问了一个问题“如果我需要为 windows 和 linux 编译不同的库文件怎么办?”所以我在这里发布了这个问题。 【参考方案1】:

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

 cmake . -DCMAKE_PREFIX_PATH="<WxWidgetsRoot>"

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

如果您的外部项目没有定位其标头/库的 CMake 脚本,您可以自己编写它,方法是创建一个 Find&lt;package&gt;.cmake 文件并将其放入您的 CMAKE_MODULE_PATH。有关详细说明,请参阅here。

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

【讨论】:

谢谢,这解决了 linux/osx 的问题,但是在可以安装库的 Windows 上,天知道在哪里最好的选择是什么?用户是否必须设置自己的“Find.cmake”文件? 如果您要实现自己的“查找”文件,他们需要考虑您想要支持的任何平台。例如,如果您查看 FindwxWidgets.cmake,您会发现其中有很多针对 Windows 和 Unix 的平台特定内容。但是,包的根目录(在用户系统上)的安装位置是用CMAKE_PREFIX_PATH完成的。

以上是关于有没有一种很好的跨平台方法来使用 CMake 包含外部 C++ 库?的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种很好的方法来模拟 Go 中的“可能”或“选项”类型?

有没有一种很好的 LINQ 方法来做笛卡尔积?

有没有办法以从 django 视图中作为上下文传递的一种很好的方式在 html 中显示 json 结果?

Laravel 以一种很好的方式使用多个控制器和视图

NHibernate与多个值的三元关联 - 如何以一种很好的方式映射

Kotlin:如何将两个语句“应用”和“让”以一种很好的方式放在一起?