Cygwin x86_64编译Clang 15.0出现汇编器报错的解决方法
报错根因
这个错误和C++代码逻辑、汇编语法错误无关,是Cygwin自带的GNU汇编器as对Windows PE格式目标文件的分区(节区)数量有默认硬上限,编译Clang AST模块的ParentMapContext.cpp时,默认编译参数生成的汇编文件分区数超过了汇编器处理阈值,直接触发分区过多、文件过大的报错。
解决方案
按顺序操作即可,不需要掌握C/汇编相关知识:
- 第一步:给编译参数加大目标文件支持开关
回到你存放LLVM编译产物的构建目录,找到CMakeCache.txt文件直接删除,重新执行cmake配置命令时,追加-DCMAKE_CXX_FLAGS="-Wa,-mbig-obj"参数,示例配置命令如下:
其中cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=OFF -DCMAKE_CXX_FLAGS="-Wa,-mbig-obj" ../llvm-Wa,-mbig-obj参数的作用是通知汇编器启用大目标文件兼容模式,放开单文件分区数量的上限,是Cygwin/MinGW环境编译大型C++项目解决此类报错的标准方案。 - 第二步:重新执行编译
配置完成后直接执行你之前用的编译命令即可,不需要删除之前已经编译完成的其他目标文件,构建系统会自动从报错中断的位置继续编译。
如果加完参数还是在同一个位置报错,就把并行编译的线程数降到1,执行make -j1单线程编译即可,单线程模式下生成的临时文件分区数会略低于高并行模式,配合大文件开关可以100%通过这个编译点。
无效操作提醒:不需要修改
ParentMapContext.cpp源码,不需要重新拉取Clang/LLVM源码,不需要替换系统自带的汇编器,这些操作对解决当前问题没有任何帮助。
内容的提问来源于stack exchange,提问作者Ryufuz
相关产品推荐
相关产品推荐

