编译旧程序遇/usr/bin/ld多重定义错误求解决
解决旧程序在AlmaLinux 9编译时的符号多重定义链接错误
问题场景
2007年发布的未修改源码的旧程序,从EL5逐步迁移编译环境到EL6、EL7,最终在AlmaLinux 9上编译时遇到链接错误:
/usr/bin/ld: 错误:db_test、db_status等多个符号存在多重定义
链接失败,make进程终止
此前迁移过程中仅调整过MySQL库的引用配置,无其他源码改动。
问题原因
GCC编译器在较新版本(AlmaLinux 9搭载的GCC默认启用-fno-common)中,默认对全局变量的符号解析规则进行了严格化:
- 旧版GCC(如EL5/EL6/EL7中的版本)默认使用
-fcommon选项,允许全局变量在多个编译单元中重复定义,链接时会自动合并这些符号 - 新版GCC默认启用
-fno-common,这种重复定义的写法会直接触发多重定义的链接错误,而旧程序的代码中恰好存在这类不符合现代编译规范的全局变量定义方式(比如在头文件中直接定义全局变量,被多个源文件包含)
解决方法
在编译时的CFLAGS中添加-fcommon选项,恢复旧版GCC的符号处理规则:
- 找到编译脚本或Makefile中设置
CFLAGS的位置 - 修改为:
CFLAGS += -fcommon - 重新执行
make即可完成编译
内容的提问来源于stack exchange,提问作者ZCT
相关产品推荐
相关产品推荐

