Manjaro系统编译xnee时cnee段错误导致编译失败如何解决
问题根因
该段错误是由于新版本GCC(10及以上)默认开启-fno-common编译参数导致的,xnee老版本代码中全局变量cnee_options采用了Common段的弱符号声明实现,在新编译规则下无法正确绑定到cnee_options_impl的实际实现地址,导致访问空指针触发段错误。你额外添加的-Wl,--allow-multiple-definition链接参数并不会解决该问题,反而可能干扰符号绑定逻辑。
解决方案
方案1:添加编译参数直接修复(无需改代码)
- 首先清理之前的编译缓存,清空自定义编译环境变量:
make distclean unset LDFLAGS CFLAGS CXXFLAGS
- 执行configure时添加
-fcommon编译参数:
./configure CFLAGS="-fcommon -O2"
- 正常执行编译即可:
make -j$(nproc)
编译完成后可通过sudo make install安装到系统路径。
方案2:代码补丁修复(如果方案1无效)
如果添加编译参数后仍存在段错误,可直接在代码中添加空指针兜底逻辑:
- 打开
src/cnee/parse.c文件,找到xnee_parse_cnee_option函数 - 在函数开头访问
cnee_options前添加如下代码:
if (cnee_options == NULL) { cnee_options = cnee_options_impl; }
- 重新执行编译即可。
临时绕开方案
如果不需要编译生成文档,可在make报错后直接手动提取编译好的二进制文件:
- 编译生成的cnee二进制路径为
src/cnee/cnee - 编译生成的xnee二进制路径为
src/libxnee/xnee
将两个文件手动复制到/usr/local/bin目录即可正常使用。
内容的提问来源于stack exchange,提问作者wee wewewe
相关产品推荐
相关产品推荐

