我正在尝试使用 CMake 从 Ubuntu 交叉编译到 Windows。我已经配置了所有内容(安装了 mingw32 和 mingw64),并且我有两者的相关工具链文件。问题是,我在一个工具链文件中设置的变量在使用后,会在第二次运行时与另一个工具链文件一起保留。
这些是我的工具链文件:
Windows 64 位:(工具链-Ubuntu-mingw64.cmake)
set(CMAKE_SYSTEM_NAME Windows)
unset(PROCESSOR_ARCHITECTURE CACHE)
set(PROCESSOR_ARCHITECTURE x64)
message("===Processor architecture: " ${PROCESSOR_ARCHITECTURE})
set(TOOLCHAIN_PREFIX x86_64-w64-mingw32)
set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++)
set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres)
set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
Windows 32 位:(工具链-Ubuntu-mingw32.cmake)
set(CMAKE_SYSTEM_NAME Windows)
unset(PROCESSOR_ARCHITECTURE CACHE)
set(PROCESSOR_ARCHITECTURE x86)
message("===Processor architecture: " ${PROCESSOR_ARCHITECTURE})
set(TOOLCHAIN_PREFIX i686-w64-mingw32)
set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++)
set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres)
set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
这是我的 CMakeLists.txt 文件的顶部:
cmake_minimum_required(VERSION 2.8)
project("project")
set(SOURCE_FILE_LIST main.c)
set(ARCH_PROJECT_NAME ${PROJECT_NAME}${PROCESSOR_ARCHITECTURE})
message("Project - " ${ARCH_PROJECT_NAME})
...
当我跑步时
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake-toolchains/Toolchain-Ubuntu-mingw64.cmake ../src/
输出以:
开头===Processor architecture: x64
Project - projectx64
跑步的时候意想不到的事情来了:
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake-toolchains/Toolchain-Ubuntu-mingw32.cmake ../src/
并且输出 still 以
开头===Processor architecture: x64
Project - projectx64
我可以做什么来解决这个问题?
CMake 将缓存它在设置过程中找到的许多值。 令人沮丧的是,它这样做到了尝试使用命令行上指定的新选项重新创建项目根本不起作用的程度。
要强制选择新变量,您可以
<buildDir>/CMakeCache.txt
<buildDir>/CMakeCache.txt
找到要更新的值并将其删除,然后重新配置项目并指定新值。根据变量在构建中实际使用的方式,第三个选项有可能触发最少量的重新构建,但也很可能如果它以任何方式影响预处理器定义,您将结束无论如何都要进行完全重建,所以选择一通常是最简单的。