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

zmi*_*jko 0 cmake cross-compiling

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

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

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

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

我可以强制CMake替代/ ZI来/ Z7(与C7兼容的调试信息)吗?

另外,如何使它仅在Release配置中而不在Debug中生成?

Fra*_*ser 5

我不认为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()
Run Code Online (Sandbox Code Playgroud)

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

如果需要,可以在此处给出冲突的标志。因此,如果删除了该string(REGEX REPLACE ...)命令并仅保留了该set命令,则${CMAKE_CXX_FLAGS_RELEASE}可以包含... /ZI ... /Z7 ...",但是只要/Z7最后一个调试信息标志是“ wins”并且是最后一个被应用的标志。

但是,对于首先要清理变量的少量工作,我认为值得删除冲突的标志。