Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在发布模式下,不可能在CMake中将/MD替换为/MT 我有一个C++库,我想在发布模式下使用VisualStudio 2017(Cug/NIJA)编译/MT编译器选项。不久前我问了一个类似的问题。这个问题的答案有帮助,但会导致编译器抱怨(报告警告)使用/MT重写/MD。然后我使用了,但设置CMAKE_CXX_FLAGS_RELEASE对发布模式下的编译器命令行参数没有影响。我的意思是,以下代码在调试模式下运行良好: set(CompilerFlags CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE) foreach(CompilerFlag ${CompilerFlags}) message("before replace: " ${${CompilerFlag}}) string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}") message("after replace: " ${${CompilerFlag}}) endforeach()_Cmake_Visual Studio 2017_Ninja - Fatal编程技术网

在发布模式下,不可能在CMake中将/MD替换为/MT 我有一个C++库,我想在发布模式下使用VisualStudio 2017(Cug/NIJA)编译/MT编译器选项。不久前我问了一个类似的问题。这个问题的答案有帮助,但会导致编译器抱怨(报告警告)使用/MT重写/MD。然后我使用了,但设置CMAKE_CXX_FLAGS_RELEASE对发布模式下的编译器命令行参数没有影响。我的意思是,以下代码在调试模式下运行良好: set(CompilerFlags CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE) foreach(CompilerFlag ${CompilerFlags}) message("before replace: " ${${CompilerFlag}}) string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}") message("after replace: " ${${CompilerFlag}}) endforeach()

在发布模式下,不可能在CMake中将/MD替换为/MT 我有一个C++库,我想在发布模式下使用VisualStudio 2017(Cug/NIJA)编译/MT编译器选项。不久前我问了一个类似的问题。这个问题的答案有帮助,但会导致编译器抱怨(报告警告)使用/MT重写/MD。然后我使用了,但设置CMAKE_CXX_FLAGS_RELEASE对发布模式下的编译器命令行参数没有影响。我的意思是,以下代码在调试模式下运行良好: set(CompilerFlags CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE) foreach(CompilerFlag ${CompilerFlags}) message("before replace: " ${${CompilerFlag}}) string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}") message("after replace: " ${${CompilerFlag}}) endforeach(),cmake,visual-studio-2017,ninja,Cmake,Visual Studio 2017,Ninja,运行CMake的结果将是: before replace: /DWIN32 /D_WINDOWS /W3 /GR /EHsc after replace: /DWIN32 /D_WINDOWS /W3 /GR /EHsc before replace: /MDd /Zi /Ob0 /Od /RTC1 after replace: /MTd /Zi /Ob0 /Od /RTC1 before replace: /MD /O2 /Ob2 /DNDEBUG after replace: /MT /O2

运行CMake的结果将是:

before replace: /DWIN32 /D_WINDOWS /W3 /GR /EHsc
after replace: /DWIN32 /D_WINDOWS /W3 /GR /EHsc
before replace: /MDd /Zi /Ob0 /Od /RTC1
after replace: /MTd /Zi /Ob0 /Od /RTC1
before replace: /MD /O2 /Ob2 /DNDEBUG
after replace: /MT /O2 /Ob2 /DNDEBUG
cl.exe  ... /MTd ...
cl.exe  ... /MD ...
建设的结果将是:

before replace: /DWIN32 /D_WINDOWS /W3 /GR /EHsc
after replace: /DWIN32 /D_WINDOWS /W3 /GR /EHsc
before replace: /MDd /Zi /Ob0 /Od /RTC1
after replace: /MTd /Zi /Ob0 /Od /RTC1
before replace: /MD /O2 /Ob2 /DNDEBUG
after replace: /MT /O2 /Ob2 /DNDEBUG
cl.exe  ... /MTd ...
cl.exe  ... /MD ...
在释放模式下,运行CMake的结果相同;然而,建设的结果将是:

before replace: /DWIN32 /D_WINDOWS /W3 /GR /EHsc
after replace: /DWIN32 /D_WINDOWS /W3 /GR /EHsc
before replace: /MDd /Zi /Ob0 /Od /RTC1
after replace: /MTd /Zi /Ob0 /Od /RTC1
before replace: /MD /O2 /Ob2 /DNDEBUG
after replace: /MT /O2 /Ob2 /DNDEBUG
cl.exe  ... /MTd ...
cl.exe  ... /MD ...

如果你知道这样做的正确方法,我会非常感谢你的

经过长时间的挣扎后,它能起作用

TARGET_COMPILE_OPTIONS(${library_name} PRIVATE "/MT$<$<CONFIG:Release>:>")
TARGET\u COMPILE\u选项(${library\u name}PRIVATE”/MT$)

您确定使用了CMAKE\u BUILD\u TYPE=Release吗?一开始它似乎对我不起作用,但我使用了RelWithDebInfo,为此需要将CMAKE_CXX_FLAGS_RelWithDebInfo添加到修补变量列表中。Fwiw我正在VS2017中使用忍者生成器。谢谢Dominik的评论。你是对的。在我写这篇文章的时候,我不知道CMake有更多的构建类型,比如RelWithDebInfo。实际上,我的(默认)构建类型是CMakeSettings.json中的RelWithDebInfo,我没有意识到它;因此,我操作了一个错误的变量(CMAKE_CXX_FLAGS_RELEASE)。