C++运行时加载的动态链接库 - Poco / qmake
C++ Dynamically Linked Libraries loaded at runtime - Poco / qmake
我在使用 Boost 和 Mac OS X 时遇到问题。
我使用Qt Creator作为C++项目的开发平台,主要是因为IDE和qmake
。
现在我正在开发一个应该是跨平台的C++应用程序,但我不想使用Qt
框架本身。相反,我使用的是STD库(C++11),Poco
和Boost
。
我正在尝试实现的一件事是在运行时加载动态链接库的插件系统。
我看到了一些项目,例如不再受支持的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 库没有经验。
如果没有关于您的环境或工具的更多详细信息...我只能提供一些非常笼统的建议:
我如何追逐这个是:
- 找到在哪个库或对象文件中定义了报告为未定义符号的符号。在类似Unix的环境中,这可以通过nm工具实现。
- 验证库或对象是否在正确的体系结构上编译(我看到您正在使用x86_64)文件工具可能会在那里为您提供帮助
- 验证是否在链接器命令行中引用库(查找 -l 表示动态或静态库),或者是否在要链接的内容列表中包含对象文件或静态库。
- 验证您引用的库是否正确(通过 -L 标志或 LD_LIBRARY_PATH env 变量(或在某些系统中LD_LIBRARY_PATH_64,例如 Solaris 用于 64 位构建)
我知道您说您已经链接了 Poco 库,但错误显然是缺少符号。要么缺少库,要么您需要摆弄 -l 标志的顺序以满足依赖项。nm 可能会帮助您确定哪些对象或库引用符号(必须排在第一位)以及哪些对象或库定义符号(必须稍后出现)。
对不起,没有提供更多帮助。
附言此外,您可能想查看可能相关的Poco Net链接错误。
另一个问题,详细说明链接器错误的不同原因:什么是未定义的引用/未解决的外部符号错误,如何解决它?
相关文章:
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- qmake:检测目标位宽(32 位或 64 位)
- Poco FindMySql.cmake 无法找到 MySQL 源代码
- 像 POCO 这样的C++图书馆如何访问网络?
- Poco::Net::FTPClientSession 在 open() 方法上挂起 129 秒,如果 ftp 主机不存
- 使用 Poco::Zip 将文件附加到现有 zip 文件
- 无法使用 Poco 库正确克隆 JSON 数组C++
- Poco 库 PUT 方法未按预期工作,尽管主机、方法、内容类型设置正确
- POCO C++对象到 JSON 字符串序列化
- 错误:字段'dateOfBirth'的类型不完整'Poco::Data::Date'
- POCO C++加密/解密
- C++ POCO - 如何在不使用 run() 方法的情况下启动线程池上的线程?
- 使用 Poco::zip 添加新目录始终给出异常
- C++ Poco - 如何创建通知队列的向量?
- 如何使用 Poco::ZIP 压缩/解压缩 zip 文件
- 使用静态 qmake 的 QT Widget 插件
- C++ POCO - 如何美化 JSON?
- C++ Poco - 如何向特定线程发送通知/消息?
- 如何在 Poco 中将工作 HTTP 代码转换为 HTTPS
- C++运行时加载的动态链接库 - Poco / qmake