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

C++ Dynamically Linked Libraries loaded at runtime - Poco / qmake

本文关键字:Poco qmake 动态链接库 运行时 加载 C++      更新时间:2023-10-16

我在使用 Boost 和 Mac OS X 时遇到问题。

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

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

我正在尝试实现的一件事是在运行时加载动态链接库的插件系统。

我看到了一些项目,例如不再受支持的Boost-extension项目和其他几个项目。

现在我正在使用 Poco 的共享库及其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 库,几乎所有内容似乎都已实现。

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

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

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

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

我如何追逐这个是:

  1. 找到在哪个库或对象文件中定义了报告为未定义符号的符号。在类似Unix的环境中,这可以通过nm工具实现。
  2. 验证库或对象是否在正确的体系结构上编译(我看到您正在使用x86_64)文件工具可能会在那里为您提供帮助
  3. 验证是否在链接器命令行中引用库(查找 -l 表示动态或静态库),或者是否在要链接的内容列表中包含对象文件或静态库。
  4. 验证您引用的库是否正确(通过 -L 标志或 LD_LIBRARY_PATH env 变量(或在某些系统中LD_LIBRARY_PATH_64,例如 Solaris 用于 64 位构建)

我知道您说您已经链接了 Poco 库,但错误显然是缺少符号。要么缺少库,要么您需要摆弄 -l 标志的顺序以满足依赖项。nm 可能会帮助您确定哪些对象或库引用符号(必须排在第一位)以及哪些对象或库定义符号(必须稍后出现)。

对不起,没有提供更多帮助。

附言此外,您可能想查看可能相关的Poco Net链接错误。

另一个问题,详细说明链接器错误的不同原因:什么是未定义的引用/未解决的外部符号错误,如何解决它?