我想从另一个 vcxproj 启动我的 QT 应用程序。当应用程序作为 .exe 文件独立执行时,没有任何问题。但是,当应用程序获取引用(通过 .lib)时,我在 Qt5Widgetsd.dll 中遇到访问冲突。然而,引用 QT 项目的项目不是 QT 项目,因此我需要手动添加 QT 库引用。
此代码从另一个线程调用 QT 应用程序: 函数调用:
QFuture<void> future = QtConcurrent::run(Start);
函数本身:
void Start()
{
int argc = 1;
char *argv[] = { (char*) "" };
QApplication a(argc, argv);
qRegisterMetaType<Mat>("Mat");
qRegisterMetaType<HANDLE>("HANDLE");
MyQTProject::g_MyQTProject = new MyQTProject();
a.exec();
}
独立时使用的 .dll:https://pastebin.com/TwQ0wrqa .
引用 QT 项目时使用的 .dll:https://pastebin.com/UYGTUMM0
最佳答案
Qt 的设计目的不是这样做:QApplication
必须在主线程中运行。虽然它通常在 Windows 上工作,尽管有这样的滥用,但它不受支持,未经测试,而且如您所见:有时它会中断。此外,它不是跨平台的。
你必须:
- 准备 Qt 的静态构建。
- 使用该 Qt 拷贝构建您的库。
除了 VC 运行时之外,库必须没有依赖项。
这是必要的,因为调用应用程序似乎也是一个 Qt 应用程序;它们似乎链接到 Qt 的同一个拷贝,然后您尝试在同一个程序中有两个 QApplication
或 QCoreApplication
对象。这是行不通的。即使您只有一个应用程序对象,还有其他全局 Qt 符号会在您的背后进行初始化,库将在您的主程序完成后尝试初始化它们。这将 起作用。
关于c++ - 项目引用上的 QT 访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58853589/