c++ - 项目引用上的 QT 访问冲突

标签 c++ qt

我想从另一个 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 上工作,尽管有这样的滥用,但它不受支持,未经测试,而且如您所见:有时它会中断。此外,它不是跨平台的。

你必须:

  1. 准备 Qt 的静态构建。
  2. 使用该 Qt 拷贝构建您的库。

除了 VC 运行时之外,库必须没有依赖项。

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

关于c++ - 项目引用上的 QT 访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58853589/

相关文章:

c++ - gSoap 缺少 stdsoap2.cpp,未定义对 `soap_peek_element' 的引用

qt - QPlainTextEdit 按行截断历史记录

c++ - 更改 HashMap 的 Qt 信号

android - 错误构建 APK QT Creator - 构建 android 包失败

c++ - 使用 std::wifstream 读取具有特殊字符的 unicode 文件

c++ - WinAPI - 从 DLL 加载资源

C++ - 将项目添加到排序数组的最快方法

C++ float 和 int 除法奇怪的行为

c++ - 寻找更好的方法将静态列表集成到一组类中

c++ - Qt 图形用户界面 : Select multiple QLabels with mouse