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

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

本文关键字:构建 选项 64位 cmake 强制 32位 使用      更新时间:2023-10-16

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

我能想出三种方法来做这件事,我应该用哪一种?

  1. 一个选项(-DUSE32bit=true)
  2. 工具链(-DCMAKE_TOOLCHAIN_FILE=64bit.TOOLCHAIN)
  3. 生成类型(-DCMAKE_build_TYPE=release32)

在我的情况下,强制32位构建将是默认的,并且应该很容易使用。强制64位构建在某些情况下也很有用,应该不会太难。使用主机系统的位宽对我的情况来说几乎没有意义,我不想支持它

我在这里发现了一个相关的问题(使用CMake强制32位编译的正确方法),但答案主要是讨论如何完成,而不是如何最好地进行配置。

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

对于带有VS 2005及更高版本的Visual Studio Generator,这将指定目标体系结构。

cmake . -DCMAKE_GENERATOR_PLATFORM=x64

TL;DR

使用工具链

深入

  1. 一个选项(-DUSE32bit=true)

我想这是不可扩展的。那么,如果你想构建N个项目呢?您必须添加N个选项。

  1. 生成类型(-DCMAKE_build_TYPE=release32)

这可能很有效。但在我看来,你把无关的东西混在一起了。此外,我确信您必须通过设置一些*_ROOTCMake变量来调整find_package的行为。使用CMAKE_BUILD_TYPE是不可能做到这一点的(至少,以一种可扩展的方式)。

  1. 工具链(-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位架构构建你的第三方ExternalProject_Add,只需将工具链传递给CMAKE_ARGS:

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

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

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

set_target_properties(${project} PROPERTIES LINK_FLAGS ${PROJ_LINK_FLAGS})

其中CCD_ 5可以是CCD_ 6或CCD_。

感谢您的所有输入,但在我这边,我最终选择了使用cmake 的-m32破解

# 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