c++ - 如何使用CMake更改构建机器类型

标签 c++ windows makefile cmake nmake

我正在学习如何使用CMake,

我正在将一个工作项目从Visual Studio转换为Cmake,并使用NMake进行构建。当前项目针对x64和x86构建。我的操作系统是Windows 10

我当前的CMakeLists.txt非常简单:

cmake_minimum_required(VERSION 3.13.0)

project(example CXX)

ADD_DEFINITIONS(-DUNICODE)
ADD_DEFINITIONS(-D_UNICODE)

set(CMAKE_CXX_FLAGS -G"NMake Makefiles")

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(SimManager
    Source/main.cpp
    )

set_target_properties (${PROJECT_NAME} PROPERTIES
    CXX_STANDARD 17
    CXX_STANDARD_REQUIRED TRUE
    CXX_EXTENSIONS FALSE
    )

我正在使用的命令是:cmake -G"NMake Makefiles ..nmake
我得到的错误是
fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'x86'
我了解NMake通过打开适当的控制台终端来选择使用哪个编译器(x86或x64)的方式。我正在为VS 2017使用Select x64 Native Tools Command Prompt

被执行的链接器的命令行为:
command "C:\PROGRA~2\MIB055~1\2019\ENTERP~1\VC\Tools\MSVC\1425~1.286\bin\Hostx86\x86\link.exe /nologo @CMakeFiles\example.dir\objects1.rsp /out:SimManager.exe /implib:SimManager.lib /pdb:E:\Projects\example\Debug\example.pdb /version:0.0 /machine:X86 /debug /INCREMENTAL /subsystem:console kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\example.dir/intermediate.manifest CMakeFiles\example.dir/manifest.res" failed (exit code 1112) with the following output: fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'x86'

我可以看到其中设置了/ machine:X86。我没有在CMakeLists.txt中设置它。如何使用64位链接器?

我尝试在cmake调用中添加建议的参数,但没有任何区别
cmake -G"NMake Makefiles" --build build64 --config Release -host_arch=amd64 -arch=amd64 ..
还尝试添加到CMakeLists中,仍然存在相同的错误
set(CMAKE_SYSTEM_PROCESSOR AMD64)
set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "-m64" LINK_FLAGS "-m64")
set(ARCH amd64)

如果可能的话,我希望在CMakeLists.txt中进行更改,因此我可以尽可能地进行命令行调用。该项目不适合32位版本。

谢谢

最佳答案

尝试在CMakeLists.txt中添加以下内容:

target_link_options(target PRIVATE /machine:x64)
参见documentation
或者,您可以编辑CMakeCache.txt并更改以下变量:
CMAKE_MODULE_LINKER_FLAGS:STRING=/machine:x64

关于c++ - 如何使用CMake更改构建机器类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61128461/

相关文章:

C++ for循环中途崩溃

具有多个值的 C++ 文件解析器

windows - 无法在 Windows 命令提示符 (cmd.exe) 中重定向输出消息

c++ - 使用参数从 cmd.exe 执行 MSYS

c - 我如何在 ubuntu 上用 Makefile 编译 C 程序?

c++ - 对 C++ 中的类型转换感到困惑

c++ - C++调试中的指针

windows - 使用 powershell 更改 IIS SSL 设置

java - 使用 Java 的 PC Toast 消息

c++11 - C++编译错误: unrecognized command line option "-std=c++11"