我有一个C ++库,我想使用Visual Studio 2017(CMake / Ninja)和/ MT编译器选项在发布模式下对其进行编译。 Here,我前段时间也问过类似的问题。该问题的答案有所帮助,但导致编译器抱怨(报告警告)有关用/ MT覆盖/ MD的信息。然后,我使用了this solution,但是设置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的结果将是:
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 ...
在发布模式下,运行CMake的结果将相同。但是,构建的结果将是:
cl.exe ... /MD ...
如果您知道这样做的正确方法,我将不胜感激。
答案 0 :(得分:0)
经过长时间的努力后仍然有效
TARGET_COMPILE_OPTIONS(${library_name} PRIVATE "/MT$<$<CONFIG:Release>:>")