为什么`project()`会影响CMake对`CMAKE_SIZEOF_VOID_P`的看法?

tho*_*i56 2 installation cmake

对于我的 CMake 项目,我想构建 32 位和 64 位版本的库,并使用 CMake 将它们安装在正确的位置。

但是,即使我使用该GNUInstallDirs模块,CMake 也不会将库安装在正确的位置。

我已经将问题追溯到project()影响 void* 大小的事实,这看起来很奇怪。(GNUInstallDirs 使用`CMAKE_SIZEOF_VOID_P)。

使用以下 CMakeLists.txt:

cmake_minimum_required(VERSION 3.7)
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
    message (STATUS "CMake think we are compiling for 64-bit")
else ()
    message (STATUS "CMake think we are compiling for something not 64-bit")
endif()
Run Code Online (Sandbox Code Playgroud)

结果是“CMake 认为我们正在编译 64 位”。

但是如果我添加

project(x)
Run Code Online (Sandbox Code Playgroud)

最后,CMake 输出“CMake 认为我们正在编译非 64 位的内容”。

是什么在project()改变这一点,我怎样才能避免这种情况?

Tsy*_*rev 5

调用project()初始化大多数与编译器相关的东西。在此之前,几乎每个 CMake 命令甚至变量都无法按预期工作。但是,CMake 不会生成与此相关的错误。

变量CMAKE_SIZEOF_VOID_P的文档明确指出,它的值是“由尝试编译确定”,因此在调用之前检查它project()是没有用的:编译器尚未设置。

正确的用法是:

cmake_minimum_required(VERSION 3.7)
project() # Initialize compiler-related stuff
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
    message (STATUS "CMake think we are compiling for 64-bit")
else ()
    message (STATUS "CMake think we are compiling for something not 64-bit")
endif()
Run Code Online (Sandbox Code Playgroud)

  • 这里似乎有一个重要的警告。尽管文档指出“CMAKE_SIZEOF_VOID_P”是由“尝试编译”确定的,但该编译似乎没有使用“CMAKE_C_FLAGS”。尝试使用“-m32”,它仍然会显示 8(对于 64 位)。在 Ubuntu 上使用 CMake 3.5.2 进行了测试。但是带有短程序的“try_run”将使用“CMAKE_C_FLAGS”并返回 4。 (2认同)