1

我使用 CMake 跨 Windows、OSX 和 Linux 生成构建文件(makefile 或项目文件),并使用这些平台原生的 C 和 C++ 编译器。在 Windows 上,我生成 VS 2010 项目,并在发布配置中发生以下错误:

命令行错误 D8016:“/ZI”和“/Ob2”命令行选项不兼容

显然,CMake 会生成不兼容的优化和调试信息选项。这是默认的 CMake 配置,我没有设置任何特殊标志。

我通过在 Visual Studio 的项目选项中将 /ZI 更改为 /Z7 来解决此问题,但这使得设置连续集成系统很烦人——我需要添加脚本来修改项目文件。

我可以强制 CMake 生成 /Z7(C7 兼容调试信息)而不是 /ZI 吗?

另外,我怎样才能让它只在发布配置中而不是在调试中生成呢?

4

1 回答 1

7

我认为 CMake/ZI默认情况下不适用于 Release 标志 - 它可能在 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()

如果它们已经存在于 Release 标志中,第一行将去除所有/Zi,/ZI/Z7标志。注意使用"round "${CMAKE_CXX_FLAGS_RELEASE}"。重要的是,此 CMake 变量保持为单个字符串。如果引号被删除,变量变成一个分号分隔的列表(即每个空格被一个分号替换),这不适合传递给编译器。

如果你愿意,你可以在这里给出冲突的标志。因此,如果您删除了string(REGEX REPLACE ...)命令并简单地留下了set命令,则${CMAKE_CXX_FLAGS_RELEASE}可以包含... /ZI ... /Z7 ...",但只要/Z7是最后一个调试信息标志,它就会“获胜”并且是最终应用的标志。

但是,对于首先清理变量的微小努力,我觉得值得剥离冲突标志。

于 2013-05-19T11:43:17.323 回答