如何通过Ubuntu命令行在CMake配置HHVM时增删编译链接标志
Ubuntu环境下CMake编译HHVM自定义编译链接标志操作指引
前置注意事项
-Wl,--emit-relocs为链接器专属选项,仅可加入链接阶段标志变量,不可写入编译阶段标志;该选项与-E(仅预处理输出)、-s(链接时剥离符号)、-c(仅编译不链接)三个参数完全互斥,配置时必须完全移除这三个冲突参数。
操作步骤
清理旧构建缓存
CMake会缓存历史配置参数,直接修改标志不清理缓存会导致配置不生效,先进入HHVM源码根目录执行以下命令:# 请将路径替换为你本地实际的HHVM源码根目录路径 cd ~/hhvm # 彻底删除旧构建目录,新建独立构建目录 rm -rf build mkdir build && cd build执行CMake配置,覆写全量标志
直接通过CMake命令行参数覆写全局编译、链接标志,跳过HHVM源码自带的默认标志注入逻辑,直接传入需要的自定义标志集,命令如下:cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_FLAGS="-O3 -fno-reorder-blocks-and-partition" \ -DCMAKE_CXX_FLAGS="-O3 -fno-reorder-blocks-and-partition" \ -DCMAKE_EXE_LINKER_FLAGS="-Wl,--emit-relocs" \ -DCMAKE_SHARED_LINKER_FLAGS="-Wl,--emit-relocs" \ -DCMAKE_MODULE_LINKER_FLAGS="-Wl,--emit-relocs" \ -DCMAKE_C_FLAGS_INIT="" \ -DCMAKE_CXX_FLAGS_INIT=""说明:最后两个INIT参数置空是为了屏蔽系统层面、CMake工具链默认注入的全局初始标志,避免隐式带入冲突的
-E/-s/-c参数。校验标志配置正确性
配置完成后执行以下命令检查,确认无冲突参数残留、自定义标志已正确写入:# 检查是否残留冲突参数,无输出则代表已完全移除 grep -rE '(\s-E\s|\s-s\s|\s-c\s)' ./CMakeCache.txt ./*/flags.make 2>/dev/null # 检查自定义标志是否生效,能匹配到对应-O3、--emit-relocs等内容即为正常 grep -E '(O3|fno-reorder-blocks-and-partition|emit-relocs)' ./CMakeCache.txt编译安装
校验通过后执行常规编译安装命令即可,-j后参数为并行编译任务数,直接取CPU逻辑核心数即可:make -j$(nproc) sudo make install
避坑提示
- 不要通过
CMAKE_CXX_FLAGS_RELEASE/CMAKE_C_FLAGS_RELEASE这类带构建类型后缀的变量传参,HHVM的CMake脚本会主动覆写这类变量,很容易覆盖自定义的标志。 - 如果需要在自定义标志基础上保留部分HHVM原有的默认标志,可以先执行一次空配置,从
CMakeCache.txt里读取出原有的CMAKE_CXX_FLAGS等变量值,手动删掉其中的-E/-s/-c参数后,再和需要的自定义标志拼接后传入即可。
内容的提问来源于stack exchange,提问作者Zahra Heydari
相关产品推荐
相关产品推荐

