【问题标题】:cmake: handle third-party dependencies (include/lib) for different compilers/platformscmake:处理不同编译器/平台的第三方依赖项(include/lib)
【发布时间】:2019-02-08 06:50:41
【问题描述】:

我需要为多个平台(Windows 和 Linux)32 位和 64 位以及多个编译器(Visual Studio 2010 和 Visual Studio 2017)构建 C++ 代码。

我使用了几个第三方,例如:Boost、Tbb、Xerces 等。

对于 Visual Studio 2010、Visual Studio 2017、32/64 位等,我需要如何处理。我需要使用不同版本的第三方包含和库?

我是否需要在 CMakeLists.txt 文件中包含类似“if”的语句,在其中我为不同的条件指定不同的包含/库路径和不同的库文件名?

【问题讨论】:

  • 是的,您可以使用if 来区分用于您项目的生成器。

标签: build cmake compilation dependencies cross-platform


【解决方案1】:

对于 Visual Studio 2010、Visual Studio 2017、32/64 位等,我需要如何处理。我需要使用不同版本的第三方包含和库?

实际上,你不需要做任何特别的事情来“处理这个事实”%) 例如,您可以下载Official prebuilt Boost binaries(例如多合一软件包)并将其安装到默认路径C:\local\boost。根据所选的工具集/VS 版本,find_package(boost ...) 将寻找合适的库,而无需您付出额外的努力。您只需使用找到的库而没有ifs。

Linux 也是如此。假设您需要 Ubuntu 18.04 amd64 和 CentOS 7 x86。如果随发行版一起提供,只需安装 boost 包,如果没有,则自行构建。然后“使用”它 %)

我是否需要在 CMakeLists.txt 文件中包含类似“if”的语句,在其中我为不同的条件指定不同的包含/库路径和不同的库文件名?

这听起来像是对 CMake 工作方式的巨大误解 %) 在您项目的 CMakeLists.txt 中,您只描述了一个(好吧,一些,用于多配置生成器)构建。为了实现这一点,您的CMakeLists.txt 为所需的第三方提供了find_package,他们将找到任何依赖项的一个版本(好的,我现在谈论的是普通项目)。然后使用不同的操作系统/环境,您可以构建所需的工件。

因此,您只是不需要“不同”的包含/库路径。从您的项目的角度来看,您只需使用find_package(用于提升等),然后使用其结果(任何导入的目标)。因为通常构建发生在一个准备好的环境中,如 docker 或 vagrant 映像,其中安装了所有先决条件,你不能使用唯一的操作系统/环境生成所有需要的构建,所以你不需要安装不同的版本......

...确切地说,您可以...理论上...但是设置交叉编译环境比烘焙目标操作系统的 docker/vagrant 映像要困难得多)。

因此,对于您的情况,您需要多次构建相同的源:

  • 适用于 Windows 和不同的 VisualStudio(2 个版本 * 2 个架构);
  • 适用于所有 Linux 发行版和架构(N-distros * 2 架构)。

【讨论】:

  • 非常感谢! find_package() 会自动为任何第三方工作吗?我如何处理未使用 CMake 构建的第三方?我需要向它们添加一些东西才能使 find_package 工作吗?
  • @AndreyRubliov 请查看find_package 的文档。有两种方法可以找到第三方包:config mode(即使用 CMake 构建的包)和 module mode(对于非 CMake 第三方)。因此,即使是非 CMake 包也可以通过 find_package 在您身边的一点帮助下找到 %)
猜你喜欢
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
  • 2015-03-26
  • 2018-08-26
  • 2013-03-16
  • 2018-12-09
相关资源
最近更新 更多