首页 >后端开发 >C++ >如何使用生成器表达式在跨平台 CMake 项目中设置编译器标志?

如何使用生成器表达式在跨平台 CMake 项目中设置编译器标志?

DDD
DDD原创
2024-11-03 01:08:02661浏览

How to Set Compiler Flags in Cross-Platform CMake Projects Using Generator Expressions?

在跨平台 CMake 项目中设置编译器标志的现代方法

使用 CMake 生成器表达式的优雅解决方案

虽然您的方法有效,但现代 CMake 使用 CMake 的生成器表达式提供了更简洁、更强大的解决方案:

cmake_minimum_required(VERSION 3.8)

project(HelloWorld)

string(
    APPEND _opts
    "$<IF:$<CXX_COMPILER_ID:MSVC>,"
        "/W4;$<$<CONFIG:RELEASE>:/O2>,"
        "-Wall;-Wextra;-Werror;"
            "$<$<CONFIG:RELEASE>:-O3>"
            "$<$<CXX_COMPILER_ID:Clang>:-stdlib=libc++>"
    ">"
)

add_compile_options("${_opts}")

与您原来的方法相比,此方法利用:

  • 生成器表达式,用于根据编译器和配置有条件地定义编译器选项。
  • 用于在列表中累积选项的字符串(APPEND ...)命令。
  • add_compile_options() 函数设置所有目标的选项。

弃用手动标志设置

正如您所注意到的,通常不鼓励手动设置 CMAKE_CXX_FLAGS 和类似变量。相反,更喜欢使用 add_compile_options() 函数来附加选项,而不修改全局标志。

多目标项目设置

在在同一目录下,您可以使用 CMake 的目标属性:

add_executable(HelloWorld_Debug_Clang HelloWorld.cpp)
target_compile_options(HelloWorld_Debug_Clang PRIVATE "-std=c++1z;-W4")
target_link_libraries(HelloWorld_Debug_Clang PRIVATE libc++)

add_executable(HelloWorld_Release_Gcc HelloWorld.cpp)
target_compile_options(HelloWorld_Release_Gcc PRIVATE "-std=c++1z;-W3")
target_link_libraries(HelloWorld_Release_Gcc PRIVATE libstdc++)

这种方法允许您为每个目标指定不同的编译器选项,同时保留单个项目文件。

现代最佳实践

  • 使用 CMake 生成器表达式进行条件标志设置。
  • 优先使用 add_compile_options() 而不是手动设置 CMAKE_CXX_FLAGS。
  • 使用不同的编译器选项创建多个目标以实现跨平台兼容性。
  • 利用构建包装脚本从单个 CMake 文件生成多个配置。

以上是如何使用生成器表达式在跨平台 CMake 项目中设置编译器标志?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn