如何在CMake文件中正确添加CFLAGS/CXXFLAGS/LDFLAGS避免配置错误
HHVM 3.30 版本HPHPCompiler.cmake编译链接选项配置指南
正确配置方法
配置前先明确选项属性,避免编译报错:
-O3、-g、-fno-reorder-blocks-and-partition属于编译阶段选项,需要加入C/C++编译器编译参数-Wl,--emit-relocs属于链接阶段传递给链接器的选项,必须加入链接器参数,不能混入编译参数,否则会触发编译器无法识别选项的错误
定位到文件中全局编译、链接参数配置块,用追加的方式写入参数,不要直接覆盖原有必要配置,参考配置代码如下:
# 追加C编译器编译选项 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -g -fno-reorder-blocks-and-partition") # 追加C++编译器编译选项 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -g -fno-reorder-blocks-and-partition") # 追加可执行文件链接选项 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--emit-relocs") # 追加动态库链接选项 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--emit-relocs")
需要移除的冲突配置项
GCC/Clang对同类型冲突参数会以命令行最后出现的参数为准,必须清理以下原有配置才能保证目标选项生效:
- 优化等级冲突项:找到文件中针对Release配置设置的
-O2参数(对应CMAKE_C_FLAGS_RELEASE、CMAKE_CXX_FLAGS_RELEASE变量)、针对Debug配置设置的-O0参数(对应CMAKE_C_FLAGS_DEBUG、CMAKE_CXX_FLAGS_DEBUG变量),将这些优化等级参数全部删除,避免覆盖-O3配置。 - 块重排冲突项:找到文件中所有
-freorder-blocks-and-partition、-freorder-blocks、-fpartition-functions这类开启代码块重排、分区的编译选项,全部删除,否则会抵消-fno-reorder-blocks-and-partition的禁用效果。 - 调试信息冲突项:找到文件中所有
-g0、编译阶段的-s参数、链接阶段的-Wl,-s/-Wl,-S这类裁剪调试符号、丢弃重定位信息的参数,全部删除,否则-g生成调试信息、--emit-relocs保留重定位条目的配置会失效。 - 链接配置冲突项:如果文件中存在
-Wl,--no-emit-relocs参数,直接删除,避免关闭重定位条目输出功能。
配置生效校验方法
- 修改完配置后,先删除构建目录下的
CMakeCache.txt文件和CMakeFiles文件夹,清除旧的CMake配置缓存,避免残留旧参数导致新配置不生效。 - 执行构建时加上
VERBOSE=1参数,查看实际执行的编译、链接命令:编译命令中需存在-O3 -g -fno-reorder-blocks-and-partition,链接命令中需存在-Wl,--emit-relocs,且上述列出的冲突参数没有出现在命令行中,即为配置生效。
注意:不要使用
add_compile_options()命令添加-Wl,--emit-relocs,该命令仅传递编译阶段参数,会触发编译器报无法识别选项的错误。
内容的提问来源于stack exchange,提问作者Zahra Heydari
相关产品推荐
相关产品推荐

