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

问题描述 投票:1回答:1

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

build cmake compilation dependencies cross-platform
1个回答
0
投票

我如何处理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。如果发布了发行版,只需安装升级包,如果没有,则自行构建。然后“使用”它%)

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

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

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

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

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

  • 适用于Windows和不同的VisualStudio(2个版本* 2架构);
  • 适用于所有Linux发行版和体系结构(N-distros * 2体系结构)。
© www.soinside.com 2019 - 2024. All rights reserved.