我使用CMake在Windows,OSX和Linux上生成构建文件(makefile或项目文件),其中C和C ++编译器是这些平台的原生代码。在Windows上我执行VS 2010项目,在发布配置中发生以下错误:
命令行错误D8016:'/ ZI'和'/ Ob2'命令行选项不兼容
显然,CMake会生成不兼容的优化和调试信息选项。这是默认的CMake配置,我没有设置任何特殊标志。
我通过在Visual Studio中的项目选项中将/ ZI更改为/ Z7来解决此问题,但这使得设置连续集成系统变得很烦人 - 我需要添加脚本来修改项目文件。
我可以强制CMake使用gnerate / Z7(C7兼容的调试信息)而不是/ ZI吗?
此外,如何才能使它仅在Release配置中生成,而不是在Debug?
中生成答案 0 :(得分:4)
我认为CMake默认情况下不会将/ZI
应用于释放标记 - 它可能会应用于CMakeLists.txt中的其他地方或其中包含的其中一个CMake文件。
尽管如此,您可以通过执行以下操作来切换标记:
if(MSVC)
string(REGEX REPLACE "/Z[iI7]" ""
CMAKE_CXX_FLAGS_RELEASE
"${CMAKE_CXX_FLAGS_RELEASE}")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Z7")
endif()
第一行删除所有/Zi
,/ZI
和/Z7
标志(如果它们已存在于Release标记中)。请注意使用"
轮"${CMAKE_CXX_FLAGS_RELEASE}"
。这个CMake变量保持单个字符串非常重要。如果删除引号,变量将成为以分号分隔的列表(即每个空格都用分号替换),这不适合传递给编译器。
如果你愿意,你可以在这里提供冲突的标志。因此,如果您删除string(REGEX REPLACE ...)
命令并只是离开set
命令,${CMAKE_CXX_FLAGS_RELEASE}
可能包含... /ZI ... /Z7 ..."
,但只要/Z7
是最后一个调试信息标志,它“赢”并且是最终应用的那个。
然而,由于首先要清理变量的努力量很小,我觉得有必要删除冲突的标志。