使用xerces链接DLL会给出未定义的符号

Linking a DLL using xerces gives undefined symbols

本文关键字:未定义 符号 xerces 链接 DLL 使用      更新时间:2023-10-16

我正在使用cygwin创建一个共享库/DLL,它使用Xerces。当我从主应用程序中调用xerxesc函数时,一切正常,但是当我试图将一些代码放入库时,我得到了xerxesc定义的所有静态内容的未定义符号。

例如:

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

注意,在上面一行中,对象出现在库之前,显然这是有区别的。我认为库的顺序只适用于库,但显然对象也必须适当地排序。