c++ - 链接 Qt5.6 会产生找不到所需引用的错误

标签 c++ windows qt makefile linker

我正在尝试使用 Qt GUI(Qt 5.6.0,因为我不能依赖 Cxx11 功能)扩展现有的 Makefile C++ 项目。问题是我无法让 Qt 正确链接。我想在 Win7 (x86-64) 下构建一个 X86 应用程序(32 位)。我已经安装了从 Qt 下载页面获得的 qt-opensource-windows-x86-mingw492-5.6.0.exe https://download.qt.io/archive/qt/5.6/5.6.0/ .一切编译。但是,链接会产生以下错误:

C:/sofit/inuit_workspace/inuit_development/tools/makefiles/inuit/MakefileCatenaISS.mk:145: recipe for target 'build/model/model.exe' failed

C:/sofit/inuit_workspace/inuit_development/tools/inuit/inuit.cpp:175: undefined reference to `_imp___ZN12QApplicationC1ERiPPci'

C:/sofit/inuit_workspace/inuit_development/tools/inuit/inuit.cpp:176: undefined reference to `_imp___ZN7QWidgetC1EPS_6QFlagsIN2Qt10WindowTypeEE'

C:/sofit/inuit_workspace/inuit_development/tools/inuit/inuit.cpp:180: undefined reference to `_imp___ZN7QWidget4showEv'

C:/sofit/inuit_workspace/inuit_development/tools/inuit/inuit.cpp:181: undefined reference to `_imp___ZN12QApplication4execEv'

C:/sofit/inuit_workspace/inuit_development/tools/inuit/inuit.cpp:307: undefined reference to `_imp___ZN12QApplicationD1Ev'

C:/sofit/inuit_workspace/inuit_development/tools/inuit/inuit.cpp:307: undefined reference to `_imp___ZN12QApplicationD1Ev'

collect2.exe: error: ld returned 1 exit status

make: *** [build/model/model.exe] Error 1

我使用以下命令链接:

C:\Qt\Qt5.6.0\Tools\mingw492_32\bin\g++.exe -g
-LC:\Qt\Qt5.6.0\5.6\mingw49_32\lib -lQt5Widgets -lQt5Core -lQt5Gui -lQt5Cored -lQt5Guid -lQt5Widgetsd -lqtmain -lqtmaind -o build/model/model.exe  ./build/model/objects/a.obj  ./build/model/objects/b.obj

我添加了一堆库和各种组合。单独使用 Widgets、Core 和 Gui 也无济于事。

相关问题(见下文)的答案中确定的潜在原因旨在 - 不匹配的架构库/编译器 - 缺少 -lQt5Widgets

但是,我认为这不适用于此处。请注意,我没有使用 CMake 或 QMake(因此没有 .pro 文件或 CMake 文件)——只是在 Eclipse Mars 中调用了普通的 Gnu make。

来源(如有兴趣):

int main(int argc, char *argv[])
    QApplication app(argc, argv);
    QWidget *widget = new QWidget;
    Ui_MainWindow ui;
    widget->show();
    return app.exec();
}

和编译器命令(如果感兴趣的话):

C:\Qt\Qt5.6.0\Tools\mingw492_32\bin\g++.exe -IC:\Qt\Qt5.6.0\5.6\mingw49_32\include -IC:/my_project -Wall -g -c -DWIN32 -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT   C:/my_project/1.cpp  -o C:/my_project/build/model/objects/1.obj

我已经尝试过使用/不使用 Qt 符号。

有谁知道可能是什么问题?

相关:

非常感谢任何帮助。

最佳答案

只有一种方法可以在不浪费大量时间的情况下让它工作:

  1. 使用 qmake 为您的项目生成 Makefile。

  2. 确保它能够构建。

  3. 如果需要,根据需要清理 Makefile。

您当然可以在更改源代码时继续使用 qmake 重新生成 Makefile。您会发现的主要事情是,手动维护 makefile 是一件非常痛苦的事情,因为您还需要维护依赖项列表,并且这需要递归扫描每个翻译单元包含的文件。换句话说,无论您自己创建什么 Makefile,都不会在您修改项目时正确地重建项目。因此,您将在开发过程中放弃 Makefile 的好处。大多数手动生成的 Makefile 严重缺乏每个源文件的适当依赖性 - 因为没有人会手动维护它,一旦你自动维护它,你还不如使用 qmake 或 cmake 来完成这项工作。

最后,没有 qmake 的 Qt,所以不使用 qmake 是愚蠢的。如果您依赖 Qt,那么假装 qmake 不存在并不能使任何事情变得更容易:您的项目无论如何都会使用 Qt 提供的许多其他二进制工具,因此给 qmake 一个特殊的地位只会浪费您的时间。如果您的项目很大,您可以通过将 cmake 与 Ninja 生成器结合使用来节省大量构建时间,因为 qmake 目前无法生成递归 Makefile,而这会导致构建性能不佳。

关于c++ - 链接 Qt5.6 会产生找不到所需引用的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43361010/

相关文章:

c++ - 我可以对我的 conan 包的用户隐藏我的链接标志吗?

windows - Windows启动的顺序是什么?

qt - 拖放到 QTreeView 中的 QStandardItemModel 不起作用

c++ - 不调用复制赋值运算符=

C++ - 第一次运行后跳过代码?

c - 打开串口 ANSI C

qt - 如何在 QtWebEngine QML 应用程序中设置用户代理

qt - 使用 vtk 6.3 和 qt5 构建 libQVTK

c++ - 从 "parent"项指针获取 `std::tuple` "children"

windows - 在 Windows 上为 Bitbucket 设置 SSH key