💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 15.4 复制编译标志 现在,让我们尝试调整编译器标志来进行引用构建。 ## 定义编译器标志 目前为止,我们还没有定义任何自定义编译器标志,参考Autotools构建中,代码是使用的编译标志有`-g -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -O2`,这些标示都是GNU C编译器可以识别的。 我们的第一个定义如下: ```cmake 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}`): ```cmake # <- we will define flags right here include(autogenerate.cmake) generate_config_h() generate_pathdef_c() generate_osdef_h() ``` 编译器标志定义的一个小修改是将`-O2`定义为Release配置标志,并关闭Debug的配置: ```cmake 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`为每个目标分别定义编译标志。这样做的好处是更灵活、范围更小。在我们的例子中,这能减少不必要的代码复制。