我正在使用 cygwin 创建一个共享库/DLL,它利用了 Xerces。当我从主应用程序调用 xercesc 函数时,一切都很好,但是当我尝试将一些代码放入库中时,我会得到 xerxesc 定义的所有静态内容的 undefined symbol 。
例如:
std::string fromXMLString(XMLCh *oXMLString)
{
std::string result;
xercesc::DOMImplementation *impl = xercesc::DOMImplementationRegistry::getDOMImplementation(X("Core"));
char *temp = xercesc::XMLString::transcode(oXMLString);
result = temp;
xercesc::XMLString::release(&temp);
return result;
}
链接:
g++ -shared -Wl,-soname,cygsupport.so -L /usr/local/lib -l xerces-c -o cygsupport.so obj/helper/xml_helper.o
链接库时,我得到:
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::DOMImplementationRegistry::getDOMImplementation(wchar_t const*)'
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLPlatformUtils::fgMemoryManager'
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLString::transcode(wchar_t const*, xercesc_3_1::MemoryManager*)'
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLPlatformUtils::fgMemoryManager'
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLString::release(char**, xercesc_3_1::MemoryManager*)'
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLPlatformUtils::fgMemoryManager'
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLString::release(wchar_t**, xercesc_3_1::MemoryManager*)'
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLPlatformUtils::fgMemoryManager'
...
最佳答案
经过几天的研究这个问题,我终于找到了解决方案。这就像愚蠢一样简单。
我原来的链接器命令行如下所示:
g++ -shared -o mylib.so -L/usr/local/lib -lxerces-c objects...
谷歌搜索这个问题没有产生任何有用的结果,所以最后我决定用 eclipse 创建一个全新的示例项目,突然它就工作了。唯一的区别在于链接器的命令行。当我将相同的命令应用于我的主项目时,它突然编译了。
g++ -L/usr/local/lib -shared -o mylib.so objects... -lxerces-c
请注意,在上面的行中,对象位于库之前,显然这会产生差异。我认为库的排序仅适用于库,但显然对象也必须适当排序。
关于c++ - 使用 xerces 链接 DLL 会给出 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16820453/