使用 cmake 强制构建 32 位或 64 位的选项

Option to force either 32-bit or 64-bit build with cmake

我想提供一种方法,始终将我的目标构建为 32 位或始终作为 64 位可执行文件,使用独立于主机系统的 cmake 可执行文件(添加“-m32”或“-m64”标志对于 gcc,还不确定如何为其他编译器做些什么)。

我可以想到三种方法来做到这一点,我应该使用哪一种?

  1. 一个选项 (-DUSE32bit=true)
  2. 一个工具链(-DCMAKE_TOOLCHAIN_FILE=64bit.toolchain)
  3. 构建类型(-DCMAKE_BUILD_TYPE=release32)

在我的例子中,强制的 32 位构建将是默认的并且应该易于使用。强制 64 位构建在某些情况下也很有用,应该不会太困难。使用主机系统的位宽对我的情况很少有意义,我不想支持它。

我在这里找到了一个相关问题 (The proper way of forcing a 32-bit compile using CMake),但答案主要讨论的是如何完成,而不是如何最好地使其可配置。

TL;DR

使用工具链

深入

  1. an option (-DUSE32bit=true)

我猜这是不可扩展的。那么如果要构建N个项目怎么办?您必须添加 N 个选项。

  1. build types (-DCMAKE_BUILD_TYPE=release32)

这可能效果很好。但在我看来,你在混合不相关的东西。此外,我确定您必须通过设置一些 *_ROOT CMake 变量来调整 find_package 行为。用 CMAKE_BUILD_TYPE 不可能做到这一点(至少,再次以可扩展的方式)。

  1. a tool chain (-DCMAKE_TOOLCHAIN_FILE=64bit.toolchain)

最佳变体。如果您想构建两个项目 - 只需使用相同的工具链:

cmake -Hproj-1 -B_builds/proj-1 -DCMAKE_TOOLCHAIN_FILE=/.../64bit.toolchain
cmake -Hproj-2 -B_builds/proj-2 -DCMAKE_TOOLCHAIN_FILE=/.../64bit.toolchain

如果您想使用 64 位架构构建您的第 3 方 ExternalProject_Add - 只需将工具链传递给 CMAKE_ARGS:

ExternalProject_Add(
    ...
    CMAKE_ARGS ... -DCMAKE_TOOLCHAIN_FILE=/.../64bit.toolchain
    ...
)

想要适应 find_package - 只需将任何 CMake 变量添加到工具链文件即可。

Visual Studio 和 https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_PLATFORM.html

For Visual Studio Generators with VS 2005 and above this specifies the target architecture.

cmake . -DCMAKE_GENERATOR_PLATFORM=x64

就我个人而言,我想在 Visual studio / cmake 配置的同一解决方案中切换到 32/64 位项目。我发现这可以使用

来完成
set_target_properties(${project} PROPERTIES LINK_FLAGS ${PROJ_LINK_FLAGS})

其中 PROJ_LINK_FLAGS 可以是 /MACHINE:X86/MACHINE:X64,具体取决于编译。

感谢您的所有意见,但在我这边,我最终选择了使用 cmake 的 -m32 hack

# cmake windows 32 bits mode bug: 32 bits link mode must be explicit (otherwise cmake will always guess a 64 bits target)
#  1- run "vcbarsall.bat x86" to setup Visual Studio build profile
#  2- "set cflags=-m32" and "set cxxflags=-m32"
#  3- let the cmake plugin "automatically" guess the target platform