c++ - 使用 xerces 链接 DLL 会给出 undefined symbol

标签 c++ dll shared-libraries xerces-c

我正在使用 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/

相关文章:

c++ - 当宏扩展为空时,临时变量会发生什么?

c++ - 二元运算符+重载的返回值是否应该是 const 并且它会干扰优化吗?

c++ - 使用 visual studio 2015/2013 时缺少 opencv_world300.lib

c++ - DLL 到 Lib 的帮助

c# - 是否可以将 LPWSTR 从 C++ DLL 返回到 C# 应用程序

c++ - 推荐用于跨平台进程内动态库绑定(bind)的 C++ 包装器(即轻量级、高性能 COM 或 CORBA)

c++ - 在 Windows 上部署 QML 应用程序的正确方法

c# - 找不到从我的 Windows 服务中删除/重新启动内存中的 DLL 状态的方法

c++ - 加载/卸载时由共享库执行的代码

c - 具有多个目标文件的动态库在加载过程中失败