cmake:处理不同编译器/平台的第三方依赖项(包括/ lib)

时间:2018-09-03 08:29:11

标签: build cmake compilation dependencies cross-platform

我需要为多个平台(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'语句的内容,以便在不同条件下指定不同的包含/库路径和不同的库文件名?

1 个答案:

答案 0 :(得分:0)

  

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

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

与Linux相同。假设您需要Ubuntu 18.04 amd64和CentOS 7 x86。只需安装带有发行版的boost软件包,否则就可以自己构建。然后“使用”%)

  

我是否需要在CMakeLists.txt文件中添加类似'if'语句的内容,以便在不同条件下指定不同的包含/库路径和不同的库文件名?

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

因此,您只需要“不同的”包含/库路径。从项目的角度来看,您仅使用find_package(用于增强等),然后使用其结果(导入的目标)。因为通常构建是在准备好的环境中进行的,例如docker或vagrant映像,其中安装了所有必备组件,并且您仅使用唯一的OS /环境就无法生成所有必需的构建,所以您不需要安装其他版本。

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

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

  • 用于Windows和其他VisualStudio(2个版本* 2个体系结构);
  • 用于所有Linux发行版和体系结构(N-distros * 2体系结构)。