在运行时加载的C ++动态链接库 - Poco / qmake

时间:2014-04-07 21:36:59

标签: c++ dll runtime poco qmake

我在使用Boost和Mac OS X时遇到了麻烦。

我使用Qt Creator作为C ++项目的开发平台,主要是因为IDE和qmake

现在我正在开发一个应该是跨平台的C ++应用程序,但我不想使用Qt框架本身。相反,我使用 STD (C ++ 11)PocoBoost

我想要实现的一个目标是在运行时加载动态链接库的插件系统。

我看到了一些像Boost-extension这样不再受支持的项目和其他几个项目。

现在我正在使用Poco's Shared Libraries和他们的Class Loader。我在演示结束时仔细阅读了教程。不幸的是我无法使它工作,我在编译时收到以下错误,其中ServiceBase类是我的插件接口。

Undefined symbols for architecture x86_64:
"Poco::SharedLibrary::getSymbol(std::string const&)", referenced from:
      Poco::ClassLoader<ServiceBase>::loadLibrary(std::string const&, std::string const&) in main.o
  "Poco::SharedLibrary::hasSymbol(std::string const&)", referenced from:
      Poco::ClassLoader<ServiceBase>::loadLibrary(std::string const&, std::string const&) in main.o
  "Poco::SharedLibrary::SharedLibrary(std::string const&)", referenced from:
      Poco::ClassLoader<ServiceBase>::loadLibrary(std::string const&, std::string const&) in main.o
  "Poco::SystemException::SystemException(std::string const&, int)", referenced from:
      Poco::MutexImpl::unlockImpl() in main.o
      Poco::MutexImpl::lockImpl() in main.o
  "Poco::LibraryLoadException::LibraryLoadException(std::string const&, std::string const&, int)", referenced from:
      Poco::ClassLoader<ServiceBase>::loadLibrary(std::string const&, std::string const&) in main.o
ld: symbol(s) not found for architecture x86_64

我已将Poco库链接起来,而且几乎所有内容都已实现。

关于如何解决这个问题的任何建议?

P.S。我也在寻找实现插件系统的替代方案,可能更强大,当然也是跨平台的。

1 个答案:

答案 0 :(得分:2)

声明。我没有这个Poco库的经验。

没有关于您的环境或工具的更多详细信息......我只能提供一些非常一般性的建议:

我如何追逐这个:

  1. 在定义的库或目标文件中找到报告为未定义符号的符号。在类似unix的环境中,可以使用nm tool
  2. 来实现
  3. 验证库或对象是否在正确的架构上编译(我看到您使用的是x86_64)file tool可能会帮助您
  4. 验证您是否在链接器命令行中引用了库(查找动态或静态库的-l),或者您在列表中包含目标文件或静态库。要链接的东西。
  5. 验证您是否引用了正确的库(通过-L标志或LD_LIBRARY_PATH env变量(或某些系统中的LD_LIBRARY_PATH_64,例如Solaris for 64bits build)
  6. 我知道你说你已经链接了Poco库,但错误显然是缺少一个符号。要么缺少库,要么需要调整-l标志的顺序以满足依赖性。 nm可以帮助您确定哪些对象或库引用到符号(必须先到达)以及哪些对象或库定义符号(必须稍后出现)。

    抱歉没有更多的帮助。

    P.S。此外,您可能希望查看可能相关的Linking error with Poco Net

    另一个对问题的引用,该问题详细说明了链接器错误的不同原因:What is an undefined reference/unresolved external symbol error and how do I fix it?