首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CMake:只为一个平台设置正确的编译器选项

CMake:只为一个平台设置正确的编译器选项
EN

Stack Overflow用户
提问于 2013-05-19 08:06:07
回答 1查看 4K关注 0票数 1

我使用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?

此外,如何使它只在发行版配置中生成,而不是在调试中生成?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-19 11:43:17

我不认为CMake在默认情况下应用/ZI来释放标志--它可能应用在CMakeLists.txt的其他地方,或者它包含的一个CMake文件中。

尽管如此,您还是可以通过执行以下操作来切换该标志:

代码语言:javascript
运行
复制
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是最后一个调试信息标志,它就“胜利”了,并且是最终应用的标志。

然而,对于首先清理变量的微小努力,我觉得有必要去掉冲突的标志。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16632578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档