我使用CMake在Windows、OSX和Linux上生成构建文件(makefile或项目文件),而C和C++编译器则是这些平台的本机。在Windows I gnerate VS 2010项目上,在发布配置中发生以下错误:
命令行错误D8016:'/ZI‘和'/Ob2’命令行选项不兼容
显然,CMake生成不兼容的优化和调试信息选项。这是默认的CMake配置,我不设置任何特殊标志。
我通过在Visual中的项目选项中将/ZI更改为/Z7来修复这个问题,但是这使得设置持续集成系统变得很麻烦--我需要添加脚本来修改项目文件。
我是否可以强迫CMake对/Z7 (C7兼容的调试信息)进行gnerate,而不是/ZI?
此外,如何使它只在发行版配置中生成,而不是在调试中生成?
发布于 2013-05-19 11:43:17
我不认为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
标志,则第一行将删除它们。注意"
圆形"${CMAKE_CXX_FLAGS_RELEASE}"
的使用。重要的是,这个CMake变量应该保持一个字符串。如果移除引号,变量将变成分号分隔列表(即每个空格被分号替换),这不适合传递给编译器。
如果你想的话,你可以在这里打冲突的旗子。因此,如果您删除了string(REGEX REPLACE ...)
命令,只留下了set
命令,${CMAKE_CXX_FLAGS_RELEASE}
就可以包含... /ZI ... /Z7 ..."
,但是只要/Z7
是最后一个调试信息标志,它就“胜利”了,并且是最终应用的标志。
然而,对于首先清理变量的微小努力,我觉得有必要去掉冲突的标志。
https://stackoverflow.com/questions/16632578
复制相似问题