如何解决GiNaC项目中std::__cxx11相关GLIBCXX版本未定义引用错误?
GiNaC库链接错误:stdc++版本不兼容问题解决
错误日志
../../ginac/lib/libginac.so: undefined reference to `std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::basic_ostringstream()@GLIBCXX_3.4.26' ../../ginac/lib/libginac.so: undefined reference to `std::__throw_bad_array_new_length()@GLIBCXX_3.4.29' collect2: error: ld returned 1 exit status
环境背景
- 集群环境,无root权限
- 自行在非默认路径
PATH_TO_XXX编译安装依赖库:- GMP-6.2.1:configure时添加
--enable-cxx选项 - CLN-1.3.6:configure时添加
--with-gmp=PATH_TO_GMP选项 - GiNaC-1.8.5
- GMP-6.2.1:configure时添加
- 通用安装命令:
LDFLAGS="-lstdc++" ./configure --prefix=PATH_TO_XXX make make check make install prefix=PATH_TO_XXX
- 触发错误的链接命令:
g++ -L../../ginac/lib -L../../ginac/cln/lib -L../../ginac/cln/gmp/lib -L../../../../../../../../lib64 -o bin/Release/LB_COL_jetInSquareDuct_solver obj/Release/Control.o obj/Release/GridCoupling.o obj/Release/Lattice.o obj/Release/main.o obj/Release/Node.o -O2 -s -lstdc++ -lcln -lgmp -lgmpxx /lib64/libstdc++.so.6 /lib64/libgomp.so.1 ../../ginac/lib/libginac.so ../../ginac/cln/lib/libcln.so ../../ginac/cln/gmp/lib/libgmp.so ../../ginac/cln/gmp/lib/libgmpxx.so
问题根源
你的推测完全正确:编译GiNaC/CLN/GMP时使用的g版本,与当前链接项目时g依赖的stdc++库版本不匹配。GLIBCXX_3.4.26和GLIBCXX_3.4.29是高版本g对应的stdc库符号,而链接命令中强制指定了系统默认的/lib64/libstdc++.so.6(低版本库),导致缺失这些符号。
解决步骤
1. 统一编译器版本
确保编译依赖库(GMP/CLN/GiNaC)和当前项目时,使用同一版本的g++:
- 若集群支持
module工具,切换到高版本gcc:module load gcc/11.2.0 # 替换为集群实际提供的高版本gcc - 若无
module,直接指定编译依赖库时用的g++完整路径来编译当前项目,比如/path/to/your/gcc/bin/g++。
2. 移除强制链接的低版本stdc++库
从链接命令中删除/lib64/libstdc++.so.6参数,避免强制绑定系统旧版本库,让编译器自动匹配当前g对应的stdc库。
3. 重新编译依赖库(若之前用低版本gcc编译)
如果之前编译GMP/CLN/GiNaC用的是低版本gcc,切换到目标高版本gcc后,重新编译安装:
# 清理旧编译文件 make clean && make distclean # 指定编译器和库路径 export CXX=/path/to/your/gcc/bin/g++ export LDFLAGS="-L/path/to/your/gcc/lib64 -lstdc++" # 重新配置编译 ./configure --prefix=PATH_TO_XXX [对应库的额外选项] make make check make install prefix=PATH_TO_XXX
替换/path/to/your/gcc为实际的高版本gcc路径,额外选项如GMP的--enable-cxx、CLN的--with-gmp=PATH_TO_GMP需保留。
4. 调整Code::Blocks项目配置
在Code::Blocks项目设置中:
- 移除链接库列表中的
/lib64/libstdc++.so.6 - 若需要,添加高版本stdc++库的搜索路径:
-L/path/to/your/gcc/lib64 - 调整链接顺序:先链接项目目标文件,再依次链接
libginac.so、libcln.so、libgmpxx.so、libgmp.so,最后链接-lstdc++
验证方法
检查依赖库所需的GLIBCXX版本:
objdump -x ../../ginac/lib/libginac.so | grep GLIBCXX
检查当前g对应stdc库的支持版本:
# 获取stdc++库路径 LIB_PATH=$(/path/to/your/gcc/bin/g++ -print-file-name=libstdc++.so.6) # 查看库支持的GLIBCXX版本 strings $LIB_PATH | grep GLIBCXX
确保后者包含前者所需的GLIBCXX_3.4.26和GLIBCXX_3.4.29。
内容的提问来源于stack exchange,提问作者messier87
相关产品推荐
相关产品推荐

