C++编译时如何正确链接xercesc库?Makefile编译报错如何解决
问题解决方法
1 修复Makefile无效链接参数
你当前的LDLIBS末尾多了半截不完整的-Wl,-rpath参数,会导致ld错误将后续的目标文件当作rpath的参数处理,不会把Test1.o加入链接列表,直接触发undefined reference to main报错。
修改LDLIBS配置,删除末尾多余的-Wl,-rpath:
LDLIBS = -lxerces-c -lm
同时调整链接命令的顺序,依赖库放在目标文件后方,避免符号解析失败:
Test1: Test1.o $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
2 补充ICU依赖配置
你使用的xerces-c库编译时依赖ICU 68版本,当前链接路径未包含ICU库,所以会报libicui18n.so.68、libicuuc.so.68、libicudata.so.68找不到的错误。
先找到本机ICU 68版本的安装路径,假设库文件在/path/to/icu68/lib,头文件在/path/to/icu68/include,修改Makefile配置:
- 在
INCLUDE中添加ICU头文件路径:-I/path/to/icu68/include - 在
LIBDIR中添加ICU库路径:-L/path/to/icu68/lib - 在
LDFLAGS的rpath中追加ICU库路径:-Wl,-rpath,$(XERCES_LIB):/path/to/icu68/lib - 在
LDLIBS中补充ICU链接参数:-licui18n -licuuc -licudata
3 修复Xerces代码逻辑问题
你当前的代码缺少Xerces必要的初始化步骤,就算编译通过运行也会崩溃,同时节点名输出逻辑也有问题,修改后的代码参考:
#include <xercesc/dom/DOMNode.hpp> #include <xercesc/dom/DOMElement.hpp> #include <xercesc/dom/DOMNodeList.hpp> #include <xercesc/parsers/XercesDOMParser.hpp> #include <xercesc/util/XMLPlatformUtils.hpp> #include <xercesc/util/XMLString.hpp> #include <string> #include <iostream> #include <map> using namespace std; using namespace xercesc; int main() { // 初始化Xerces环境 XMLPlatformUtils::Initialize(); string scRes = "scRes.xml"; XercesDOMParser* parser = new XercesDOMParser; parser->parse(scRes.c_str()); DOMNodeList* nodeList = parser->getDocument()->getDocumentElement()->getChildNodes(); DOMNode* root = nodeList->item(0); // 转码XMLCh为char*后输出 char* rootName = XMLString::transcode(root->getNodeName()); std::cout << rootName << endl; XMLString::release(&rootName); for (unsigned int i = 0; i < root->getChildNodes()->getLength(); i++) { DOMNode* curr = root->getChildNodes()->item(i); char* currName = XMLString::transcode(curr->getNodeName()); std::cout << currName << endl; XMLString::release(&currName); } // 释放资源,关闭Xerces环境 delete parser; XMLPlatformUtils::Terminate(); return 0; }
内容的提问来源于stack exchange,提问作者eddieisnutty
相关产品推荐
相关产品推荐

