返回介绍

15.4 复制编译标志

发布于 2025-05-06 21:46:01 字数 1129 浏览 0 评论 0 收藏 0

现在,让我们尝试调整编译器标志来进行引用构建。

定义编译器标志

目前为止,我们还没有定义任何自定义编译器标志,参考 Autotools 构建中,代码是使用的编译标志有 -g -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -O2 ,这些标示都是 GNU C 编译器可以识别的。

我们的第一个定义如下:

if(CMAKE_C_COMPILER_ID MATCHES GNU)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -O2")
endif()

并且,在生成源文件之前,我们将把这段代码放在 src/CMakeLists.txt 的顶部(因为 pathdef.c 有使用到 ${CMAKE_C_FLAGS} ):

# <- we will define flags right here
include(autogenerate.cmake)
generate_config_h()
generate_pathdef_c()
generate_osdef_h()

编译器标志定义的一个小修改是将 -O2 定义为 Release 配置标志,并关闭 Debug 的配置:

if(CMAKE_C_COMPILER_ID MATCHES GNU)
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -U_FORTIFY_SOURCE
  -D_FORTIFY_SOURCE=1")
  set(CMAKE_C_FLAGS_RELEASE "-O2")
  set(CMAKE_C_FLAGS_DEBUG "-O0")
endif()

请使用 make VERBOSE=1 验证,构建是否使用了预期的标志。

编译器标志的作用域

在这个特殊的示例项目中,所有源文件都使用相同的编译标志。对于其他项目,我们可能不希望像上面那样全局定义编译标志,而是使用 target_compile_options 为每个目标分别定义编译标志。这样做的好处是更灵活、范围更小。在我们的例子中,这能减少不必要的代码复制。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。