SLES 15系统下使用GCC 4.3.4编译C++代码出现链接错误咨询
问题根因
这两类报错均为SLES 15系统原生库与手动安装的GCC 4.3.4不兼容导致:
__umoddi3/__udivdi3多重定义:这两个是GCC内置的64位整数运算辅助函数,SLES 15自带的新版glibc已导出这两个符号,和GCC 4.3.4自带libgcc中的同名符号冲突。__gnu_cxx::__exchange_and_add未定义:该函数是GCC 4.3版本libstdc中实现std::string引用计数的原子操作函数,SLES 15自带的GCC 7对应libstdc已修改/移除了该实现,链接时默认找系统高版本libstdc++就会找不到符号。你代码中std::string的追加操作触发了对该函数的调用。
排查步骤
- 确认头文件引用优先级,执行编译命令加
-v参数:
g++ -v -m32 -c LicenseFile.cpp
检查输出的include路径是否优先指向你安装GCC 4.3.4的自带头文件目录,而非系统/usr/include/c++/7等高版本头文件目录。
2. 确认库搜索优先级,执行:
g++ -print-search-dirs
检查输出的库搜索路径是否优先指向GCC 4.3.4的对应库目录,而非系统默认库目录。
3. 检查现有链接参数是否存在-nostdinc/-nostdlib等强制使用系统库的参数。
解决方法
方案1:调整编译链接参数(推荐)
- 编译阶段增加GCC 4.3.4头文件路径,确保优先使用老版本头文件:
-I<GCC4.3.4安装路径>/include/c++/4.3.4 -I<GCC4.3.4安装路径>/include/c++/4.3.4/x86_64-suse-linux -I<GCC4.3.4安装路径>/lib/gcc/x86_64-suse-linux/4.3.4/include
- 链接阶段优先指定GCC 4.3.4的32位运行时库路径(因你使用
-m32编译32位程序),并显式链接对应版本的运行时库:
-L<GCC4.3.4安装路径>/lib/gcc/x86_64-suse-linux/4.3.4/32 -L<GCC4.3.4安装路径>/lib32 -lgcc -lgcc_eh -lstdc++
以上路径要放在你现有-L参数的最前面,确保优先级最高。
- 若多重定义报错仍存在,可临时在链接参数中加
-Wl,--allow-multiple-definition绕开冲突。
方案2:避免软链接调用GCC
不要用软链接将g++-4.3.4替换为系统默认g++,直接用GCC 4.3.4的绝对路径调用(比如安装到/opt/gcc434的话就用/opt/gcc434/bin/g++),GCC会自动查找自身对应的头文件和库路径,减少配置错误。
方案3:环境隔离(最稳定)
在SLES 15中通过chroot、容器等方式搭建SLES 11编译环境,完全隔离SLES 15的新系统库,可100%兼容原有编译逻辑。
内容的提问来源于stack exchange,提问作者Rakesh Mehta
相关产品推荐
相关产品推荐

