g++链接xerces-c库时出现未定义符号错误求助
解决G++链接Xerces-C时的未定义符号错误
这个问题我之前碰到过,本质是编译器/运行时库不兼容导致的,咱们一步步拆解解决:
错误原因分析
你看到的这些__1cG__Crun开头的符号,是Sun/Oracle Studio编译器的C++运行时库(libCrun.so)特有的名字修饰符号,而你当前用的是GCC(g++)编译器——GCC依赖的是libstdc++标准库,名字修饰规则和Sun Studio完全不同,自然找不到这些专属符号。
这说明你安装的libxerces-c-3.2.so是用Sun Studio编译的,和你的代码编译环境(GCC)不匹配。
解决方法
方法一:用GCC重新编译Xerces-C库
这是最稳妥的方案,确保库和你的代码用同一套编译工具链:
- 下载Xerces-C 3.2的源码包(如果还未获取)
- 解压后进入源码目录,执行配置命令,明确指定用GCC作为编译工具:
这里./configure CC=gcc CXX=g++ --prefix=/export/home/ab0599/local--prefix保持你原来的安装路径,后续会替换掉旧的库文件。 - 编译并安装:
make make install - 重新执行你的编译命令,应该就能正常完成链接了。
方法二:切换到Sun Studio编译器编译你的代码
如果没法重新编译Xerces-C库,那只能用和库匹配的编译器来编译你的代码:
- 用Sun Studio的
CC命令代替g++,调整编译参数:
注意Sun Studio的参数可能和GCC略有差异,比如CC -std=c++14 -m32 -I/export/home/ab0599/local/include -L/export/home/ab0599/local/lib xerces_tst1.cpp -o xerces_tst1 -lxerces-c-3.2-std=c++14可能需要换成-std=c++1y或者对应版本的参数,需要根据你的Sun Studio版本调整。
额外验证技巧
你可以用nm命令查看库的符号,确认它的编译环境:
nm /export/home/ab0599/local/lib/libxerces-c-3.2.so | grep "__1c"
如果输出大量类似的符号,就坐实了这个库是Sun Studio编译的;如果是GCC编译的,符号会以_Z开头(GCC的名字修饰前缀)。
内容的提问来源于stack exchange,提问作者Andrei Sibircevs
相关产品推荐
相关产品推荐

