项目引用上的QT访问冲突

QT access violation on project reference

本文关键字:QT 访问冲突 引用 项目      更新时间:2023-10-16

我想从另一个vcxproj启动我的QT应用程序。当应用程序以.exe的形式独立执行时,没有任何问题。然而,当应用程序(通过.lib(获得引用时,我在Qt5Widgetsd.dll中遇到访问冲突。然而,引用QT项目的项目不是QT项目,因此我需要手动添加QT lib引用。

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上运行,但它不受支持,也不经过测试,正如你所看到的:有时它会崩溃。此外,它不是跨平台的。

你必须:

  1. 准备一个Qt的静态构建
  2. 使用Qt的副本构建您的库

除了VC运行时之外,库不能有任何依赖项。

这是必要的,因为调用应用程序似乎也是一个Qt应用程序;它们似乎链接到Qt的同一副本,然后您尝试在同一程序中有两个QApplicationQCoreApplication对象。这是行不通的。即使你只有一个应用程序对象,还有其他全局Qt符号在你背后初始化,库会在你的主程序完成后尝试初始化它们。这将无法工作。