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

时间:2013-05-19 08:06:07

标签: cmake cross-compiling

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

中生成

1 个答案:

答案 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是最后一个调试信息标志,它“赢”并且是最终应用的那个。

然而,由于首先要清理变量的努力量很小,我觉得有必要删除冲突的标志。