编译xcrysden依赖Mesa时make报错,求解决方案
解决Mesa 18.3.6编译时链接器符号重复定义错误
错误原因
链接器报出的INTEL_DEBUG和radeon_enabled_debug_types重复定义,本质是全局变量在多个编译单元中被重复声明并定义。当编译静态库时,这些全局变量会被保留在每个静态库的目标文件中,最终链接多个静态库时,链接器发现同一个符号存在多个定义,因此抛出错误:
INTEL_DEBUG在src/intel/common/gen_disasm.c和src/intel/common/gen_debug.c中都被定义为全局变量radeon_enabled_debug_types在src/mesa/drivers/dri/radeon/radeon_debug.c和src/mesa/drivers/dri/r200/radeon_debug.c中重复定义
修复步骤
1. 修正重复定义的全局变量
针对
INTEL_DEBUG:
打开src/intel/common/gen_disasm.c,找到第31行的变量定义(类似int INTEL_DEBUG = 0;),将其改为外部声明:extern int INTEL_DEBUG;保留
src/intel/common/gen_debug.c中第39行的原始定义不动。针对
radeon_enabled_debug_types:
选择src/mesa/drivers/dri/radeon/radeon_debug.c或src/mesa/drivers/dri/r200/radeon_debug.c其中一个文件,将第60行的变量定义改为外部声明:extern unsigned int radeon_enabled_debug_types;保留另一个文件中的原始定义。
2. 调整编译选项避免符号冲突
重新配置Mesa时,添加符号可见性控制的编译选项,将非必要全局符号隐藏,减少冲突概率:
./configure CFLAGS="-fvisibility=hidden" CXXFLAGS="-fvisibility=hidden" [你的原有配置参数]
3. 清理并重新编译
执行以下命令清理旧编译产物,重新编译:
make clean make -j$(nproc)
4. (可选)调整链接规则
如果上述方法无效,进入src/mesa/drivers/dri目录,打开Makefile找到第719行附近的mesa_dri_drivers.la链接规则,检查是否同时链接了包含重复符号的静态库,尝试调整链接顺序或移除重复的库依赖。
内容的提问来源于stack exchange,提问作者Elliot Perviz
相关产品推荐
相关产品推荐

