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

时间:2017-10-13 15:20:59

标签: c++ cmake cross-platform static-libraries

我对cmake很陌生,但到目前为止我对我的测试项目非常喜欢,并且迫不及待地将它用于我的下一个真实项目。

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

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

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

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

这是一个在谷歌搜索中难以表达的问题,很抱歉,如果它已被问到。

1 个答案:

答案 0 :(得分:2)

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

 cmake . -DCMAKE_PREFIX_PATH="<WxWidgetsRoot>"

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

如果您的外部项目没有找到其标题/库的CMake脚本,您可以通过创建Find<package>.cmake文件并将其放入CMAKE_MODULE_PATH来自行编写。有关详细说明,请参阅here

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