- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在做一个大项目,我试图用 QLibrary 动态加载一个共享库,我能够在下面重现运行时链接错误(undefined symbol: staticMetaObject
)示例:
文件夹结构:
root\
-- src\
---- TestLib\
------ TestLib.pro
------ Derived.h
------ Derived.cpp
------ TestLibModuleBridge.h
------ TestLibModuleBridge.cpp
---- TestLibCommon\
------ IBase.h
---- TestLibManager\
------ TestLibManager.pro
------ main.cpp
--lib\
测试库文件:
# TestLib.pro
QT -= gui
TARGET = TestLib
TEMPLATE = lib
QMAKE_CXXFLAGS += -Wall
DEFINES += TESTLIB_LIBRARY
SOURCES += Derived.cpp \
TestLibModuleBridge.cpp
HEADERS += Derived.h \
TestLibModuleBridge.h
INCLUDEPATH += ../TestLibCommon
unix {
target.path = ../../lib
INSTALLS += target
}
-
// Derived.h
#ifndef DERIVED_H
#define DERIVED_H
#include "IBase.h"
#include <iostream>
class Derived : public IBase
{
Q_OBJECT
public:
Derived();
virtual ~Derived();
public:
virtual void methodA();
virtual void methodB();
};
#endif // DERIVED_H
-
// Derived.cpp
#include "Derived.h"
Derived::Derived()
{
}
Derived::~Derived()
{
}
void Derived::methodA()
{
std::cout << "methodA()" << std::endl;
}
void Derived::methodB()
{
std::cout << "methodB()" << std::endl;
}
-
// TestLibModuleBridge.h
#ifndef TESTLIBMODULEBRIDGE_H
#define TESTLIBMODULEBRIDGE_H
#include "IBase.h"
#ifdef __cplusplus
extern "C" {
#endif
IBase* getModuleInterface();
#ifdef __cplusplus
}
#endif
#endif // TESTLIBMODULEBRIDGE_H
-
// TestLibModuleBridge.cpp
#include "TestLibModuleBridge.h"
#include "Derived.h"
IBase* getModuleInterface()
{
return new Derived();
}
TestLibManager 文件:
// TestLibManager.pro
QT += core
QT -= gui
TARGET = TestLibManager
CONFIG += console
CONFIG -= app_bundle
QMAKE_CXXFLAGS += -Wall
TEMPLATE = app
SOURCES += main.cpp
INCLUDEPATH += ../TestLibCommon
-
// main.cpp
#include <QCoreApplication>
#include <QLibrary>
#include <QDebug>
#include "IBase.h"
typedef IBase* (*ModuleGetterFunction) (void);
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QLibrary testLib("../../lib/libTestLib.so");
if (!testLib.load())
{
qDebug() << "Error : " << testLib.errorString();
exit(EXIT_FAILURE);
}
else
{
ModuleGetterFunction getModuleInterfaceFunc = (ModuleGetterFunction) testLib.resolve("getModuleInterface");
if (getModuleInterfaceFunc)
{
IBase* obj = getModuleInterfaceFunc();
obj->methodA();
obj->methodB();
}
}
return a.exec();
}
TestLibCommon 文件
// IBase.h
#ifndef IBASE_H
#define IBASE_H
#include <QObject>
class IBase : public QObject
{
Q_OBJECT
protected:
virtual ~IBase() {}
public:
virtual void methodA() = 0;
virtual void methodB() = 0;
};
#endif // IBASE_H
testLib.load()
失败并显示 错误:“无法加载库 ../../lib/libTestLib.so: (../../lib/libTestLib.所以: undefined symbol :_ZN5IBase16staticMetaObjectE)"
我该如何解决这个问题,从 IBase.h
中删除 Q_OBJECT
宏将修复错误,但在生产项目中接口(interface)包含信号和槽,它来 self 们不允许更改的项目。
最佳答案
看起来像moc
在编译测试库之前还没有运行。 moc
负责生成 staticMetaObject
对于包含 Q_OBJECT
的类宏和列在HEADERS
下pro 文件中的部分。
添加TestLibCommon\IBase.h
到 HEADERS
在 TestLib.pro 中应该可以解决这个问题。 (未经测试)。
您的解决方案可能的改进:
而不是使用 QLibrary
看看QPluginLoader .
QPluginLoader 会给你一个 QObject
然后您可以使用 qobject_cast<T*>(pluginloader.instance())
将其转换为您想要的任何界面
这是一个使用 QPluginLoader
的例子: http://doc.qt.io/qt-5/qtwidgets-tools-plugandpaint-example.html
关于c++ - QT QLibrary "Cannot load library *.so: (*.so: undefined symbol: staticMetaObject)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31480066/
我正在使用 QLibrary 从一个 .dll 文件加载函数。我成功加载它,成功解析功能。但是当我第一次使用那个 .dll 中的某些函数时,这个函数运行起来非常慢(即使它是一个非常简单的函数)。下次我
我有一个 QT 库,我想将它导入到另一个项目中。 现在,既然我想要那个,即使我修改了库,另一个项目也不需要重新编译,我开始使用 QLibrary。 但是...我无法导入类。或者更好的是,我可以导入该类
QLibrary可以很好地从.so库的一个实例中获取一组函数指针。但是,当尝试从同一个.so文件中获取函数指针的两个不同实例时,它不起作用。两组指针均指向内存中的相同位置,从而使其变得多余且无用。根据
我发现了以下用于在 Qt 中加载库的代码,但我不完全理解它是如何工作的。有人能给我解释一下吗:typedef int (*MyPrototype)(int, int);? int r1 = 0; QL
我现在正在尝试动态包含类文件,并选择通过将 .dll 加载到 QLibrary 中来实现。我现在遇到的问题是,当我尝试调用 resolve() 方法时,它返回 0。 编辑:与此同时,问题已经解决,我决
让我们考虑 Qt 文档中的这个片段: QLibrary myLib("mylib"); typedef void (*MyPrototype)(); MyPrototype myFunction =
我有一个动态加载 B.so 的可执行文件 A,而 B.so 又依赖于 C.so。 C.so 与 A 和 B 不在同一个文件夹中。 我正在尝试使用 QLibrary.load() 加载 B.so 但未能
当我尝试加载与二进制文件存储在同一目录中的特定库时,出现错误: Cannot load library uuirtdrv.so: (uuirtdrv.so: cannot open shared ob
我正在做一个大项目,我试图用 QLibrary 动态加载一个共享库,我能够在下面重现运行时链接错误(undefined symbol: staticMetaObject)示例: 文件夹结构: root
我已经成功编译了 MySQL 驱动程序,但我无法强制 Qt 加载它们。 一开始应该说的是,我在安装包中获得了 ODBC 和 SQLite 驱动程序(在安装 Qt 之后),但也没有检测到它们。 在 *C
我是一名优秀的程序员,十分优秀!