为什么g++编译Matlab C++程序时会链接错误版本的libstdc++.so库?
问题解决方案
这个错误的核心原因是链接阶段没有优先加载gcc 7对应的libstdc++库,libMatlabEngine.so依赖的CXXABI_1.3.8版本符号仅在gcc 5.1及以上版本的libstdc++中提供,CentOS 7默认自带的gcc 4.8.5对应的libstdc++不包含该符号。你配置的LD_LIBRARY_PATH主要用于程序运行时的动态库搜索,编译链接阶段的优先级低于命令行显式指定的参数,因此没有生效。
可按以下步骤解决:
- 调整编译命令中
-L参数的顺序,将devtoolset 7的库路径放在所有第三方库路径之前,确保链接器优先搜索gcc 7对应的库文件 - 可选添加
-static-libstdc++参数,将gcc 7的libstdc++静态编译到可执行文件中,避免运行时仍出现符号找不到的兼容问题 - 提前验证devtoolset 7的
libstdc++包含所需符号,执行命令:
strings /opt/rh/devtoolset-7/root/usr/lib64/libstdc++.so.6 | grep CXXABI_1.3.8
只要输出包含CXXABI_1.3.8字符串即说明库版本符合要求。
调整后的编译命令参考:
g++ -o matlab_test matlab_test.cpp \ -I/home/matlab/lnx_x64/R2017B/release/inc \ -L/opt/rh/devtoolset-7/root/usr/lib64 \ -L/home/matlab/R2017B/release/lib \ -lMatlabEngine -lpthread \ -static-libstdc++ \ -Wl,-v
如果不需要静态链接libstdc++,去掉-static-libstdc++参数即可,只要保证devtoolset的-L路径在最前,即可正确链接到动态版本的新libstdc++。
内容的提问来源于stack exchange,提问作者TonySalimi
相关产品推荐
相关产品推荐

