在 Visual Studio 2017 中使用 Qt 库的 CMake 项目:运行 exe 时找不到 Qt dll

Dav*_*idY 6 c++ qt cmake visual-studio

我正在尝试将 Qt 库用于带有 Visual Studio 的 CMake 项目。我能够使用 CMake 找到所有 Qt5 组件(例如 Qt5Sql 和 Qt5Core)。当我为测试做源文件时,我还可以访问 Qt 对象。

但是,在我完成构建并尝试运行生成的可执行文件后,它抱怨“您的计算机中缺少 Qt5Sql.dll”。然后我将 dll 复制到可执行文件所在的构建文件夹,但这并没有解决问题。然而,虽然我认为 Qt5Core 也在测试中使用,但它并没有抱怨 Qt5Core,也没有说它丢失了。

以下是我的问题:

  • 为什么 Qt 组件可用于源文件,但不可用于可执行文件?我应该在哪里保存 dll 文件以便 exe 文件可以找到它们?
  • 我已经阅读了很多关于静态库、动态库和共享库的文档,但仍然对它们在这种情况下的应用方式感到困惑。如何在部署中包含 Qt 组件,以便 exe 不需要查找 dll?这是一个非常基本的问题,但任何帮助表示赞赏!
  • 为什么 exe 试图找到“Qt5Sql.dll”而不是“QtCore.dll”?我相信两者都在测试文件中使用。
  • 当我已经链接了 CMakeLists.txt 中的 lib 文件时,为什么它会查找 dll 文件。

使用的工具和系统:CMake 3.8.1、Qt 5.9 beta、Visual Studio 2017、windows 10

下面是我用于测试的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.6)
project(testQt)

set(CMAKE_PREFIX_PATH D:\\Qt\\5.9\\msvc2015_64\\lib\\cmake)
set (CMAKE_AUTOMOC ON)
set (CMAKE_INCLUDE_CURRENT_DIR ON)

find_package(Qt5 REQUIRED COMPONENTS
    Core
    Sql
    Widgets
    Gui
    )

 add_executable(test test.cpp)
 target_link_libraries(test
    Qt5::Core 
    Qt5::Sql
    )
Run Code Online (Sandbox Code Playgroud)

下面是 test.cpp。我已经在 Qt 创建器中尝试了 test.cpp 并且它在那里工作。它只是建立与本地数据库的连接。

#include <QtDebug>
#include <QString>
#include <QtSql>
#include <QSqlDatabase>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlError>
#include <QtSql/QSqlDriver>


int main()
{

    QString servername = "DESKTOP-NAME\\SQLEXPRESS";
    QString dbname = "sql_db_test";
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");  
    db.setConnectOptions();
    QString dsn = QString("Driver={SQL Server};Server=%1;DATABASE=%2;Trusted_Connection=Yes;").arg(servername).arg(dbname);
    db.setDatabaseName(dsn);
    qDebug() << db.connectionName();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

[编辑] 下面是 Dependency Walker 的日志文件

***************************| Module Dependency Tree |***************************
*                                                                              *
* Legend: F  Forwarded Module   ?  Missing Module        6  64-bit Module      *
*         D  Delay Load Module  !  Invalid Module                              *
*         *  Dynamic Module     E  Import/Export Mismatch or Load Failure      *
*                               ^  Duplicate Module                            *
*                                                                              *
********************************************************************************

[  6] test.EXE
     [ ? ] QT5SQLD.DLL
     [ ? ] QT5CORED.DLL
     [  6] MSVCP140D.DLL
          [ ^6] VCRUNTIME140D.DLL
          [ ^6] UCRTBASED.DLL
          [ ^6] KERNEL32.DLL
               [F^6] NTDLL.DLL
          [D 6] CONCRT140D.DLL
               [ ^6] MSVCP140D.DLL
               [ ^6] VCRUNTIME140D.DLL
               [ ^6] UCRTBASED.DLL
               [ ^6] KERNEL32.DLL
                    [F^6] NTDLL.DLL
     [  6] VCRUNTIME140D.DLL
          [ ^6] UCRTBASED.DLL
          [ ^6] KERNEL32.DLL
               [F^6] NTDLL.DLL
     [  6] UCRTBASED.DLL
          [  6] API-MS-WIN-CORE-STRING-L1-1-0.DLL
               [F^6] KERNEL32.DLL
          [  6] API-MS-WIN-CORE-ERRORHANDLING-L1-1-0.DLL
               [F^6] KERNEL32.DLL
          [  6] API-MS-WIN-CORE-FILE-L1-1-0.DLL
               [F^6] KERNEL32.DLL
          [  6] API-MS-WIN-CORE-TIMEZONE-L1-1-0.DLL
               [F^6] KERNEL32.DLL
          [  6] API-MS-WIN-CORE-HANDLE-L1-1-0.DLL
               [F^6] KERNEL32.DLL
          [  6] API-MS-WIN-CORE-NAMEDPIPE-L1-1-0.DLL
               [F^6] KERNEL32.DLL
          [  6] API-MS-WIN-CORE-FILE-L2-1-0.DLL
               [F^6] KERNEL32.DLL
          [  6] API-MS-WIN-CORE-HEAP-L1-1-0.DLL
               [F^6] KERNEL32.DLL
                    [F^6] NTDLL.DLL
          [  6] API-MS-WIN-CORE-SYSINFO-L1-1-0.DLL
               [F^6] KERNEL32.DLL
          [  6] API-MS-WIN-CORE-LIBRARYLOADER-L1-1-0.DLL
               [F^6] KERNEL32.DLL
          [  6] API-MS-WIN-CORE-SYNCH-L1-1-0.DLL
               [F^6] KERNEL32.DLL
                    [F^6] NTDLL.DLL
          [  6] API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL
               [F^6] KERNEL32.DLL
                    [F^6] NTDLL.DLL
          [  6] API-MS-WIN-CORE-PROCESSENVIRONMENT-L1-1-0.DLL
               [F^6] KERNEL32.DLL
          [  6] API-MS-WIN-CORE-DATETIME-L1-1-0.DLL
               [F^6] KERNEL32.DLL
          [  6] API-MS-WIN-CORE-LOCALIZATION-L1-2-0.DLL
               [F^6] KERNEL32.DLL
          [  6] API-MS-WIN-CORE-SYNCH-L1-2-0.DLL
               [F^6] KERNEL32.DLL
          [  6] API-MS-WIN-CORE-CONSOLE-L1-1-0.DLL
               [F^6] KERNEL32.DLL
          [  6] API-MS-WIN-CORE-DEBUG-L1-1-0.DLL
               [F^6] KERNEL32.DLL
          [  6] API-MS-WIN-CORE-RTLSUPPORT-L1-1-0.DLL
               [F^6] NTDLL.DLL
          [  6] API-MS-WIN-CORE-PROCESSTHREADS-L1-1-1.DLL
               [F^6] KERNEL32.DLL
          [  6] API-MS-WIN-CORE-FILE-L1-2-0.DLL
               [F^6] KERNEL32.DLL
          [  6] API-MS-WIN-CORE-PROFILE-L1-1-0.DLL
               [F^6] KERNEL32.DLL
          [  6] API-MS-WIN-CORE-MEMORY-L1-1-0.DLL
               [F^6] KERNEL32.DLL
          [  6] API-MS-WIN-CORE-UTIL-L1-1-0.DLL
               [F^6] KERNEL32.DLL
                    [F^6] NTDLL.DLL
          [  6] API-MS-WIN-CORE-INTERLOCKED-L1-1-0.DLL
               [F^6] KERNEL32.DLL
                    [F^6] NTDLL.DLL
     [  6] KERNEL32.DLL
          [ ? ] API-MS-WIN-CORE-RTLSUPPORT-L1-2-0.DLL
          [  6] NTDLL.DLL
          [  6] KERNELBASE.DLL
               [ ^6] NTDLL.DLL
               [ ^6] API-MS-WIN-EVENTING-PROVIDER-L1-1-0.DLL
                    [F^6] ADVAPI32.DLL
                         [F^6] NTDLL.DLL
               [ ? ] API-MS-WIN-CORE-APIQUERY-L1-1-0.DLL
               [D? ] EXT-MS-WIN-ADVAPI32-REGISTRY-L1-1-0.DLL
               [D? ] EXT-MS-WIN-KERNEL32-APPCOMPAT-L1-1-0.DLL
               [D? ] EXT-MS-WIN-NTUSER-STRING-L1-1-0.DLL
               [D? ] EXT-MS-WIN-KERNEL32-FILE-L1-1-0.DLL
               [D? ] EXT-MS-WIN-KERNEL32-DATETIME-L1-1-0.DLL
               [D? ] EXT-MS-WIN-KERNEL32-QUIRKS-L1-1-0.DLL
               [D? ] EXT-MS-WIN-KERNEL32-QUIRKS-L1-1-1.DLL
               [D? ] EXT-MS-WIN-KERNEL32-SIDEBYSIDE-L1-1-0.DLL
               [D? ] EXT-MS-WIN-MRMCORER-RESMANAGER-L1-1-0.DLL
               [D? ] EXT-MS-WIN-KERNEL32-WINDOWSERRORREPORTING-L1-1-0.DLL
               [D? ] EXT-MS-WIN-KERNEL32-WINDOWSERRORREPORTING-L1-1-1.DLL
               [D? ] EXT-MS-WIN-GPAPI-GROUPPOLICY-L1-1-0.DLL
               [D? ] EXT-MS-WIN-NTDSAPI-ACTIVEDIRECTORYCLIENT-L1-1-0.DLL
               [D? ] EXT-MS-WIN-NTDSAPI-ACTIVEDIRECTORYCLIENT-L1-1-1.DLL
               [D? ] EXT-MS-WIN-SHELL32-SHELLCOM-L1-1-0.DLL
               [D? ] EXT-MS-WIN-ADVAPI32-NTMARTA-L1-1-0.DLL
               [D? ] EXT-MS-WIN-SECURITY-CAPAUTHZ-L1-1-0.DLL
               [D? ] EXT-MS-WIN-FECLIENT-ENCRYPTEDFILE-L1-1-0.DLL
               [D? ] EXT-MS-WIN-SECURITY-EFSWRT-L1-1-1.DLL
               [D? ] EXT-MS-WIN-APPMODEL-DAXCORE-L1-1-0.DLL
               [D? ] EXT-MS-WIN-KERNEL32-ERRORHANDLING-L1-1-0.DLL
               [D? ] EXT-MS-WIN-KERNEL32-REGISTRY-L1-1-0.DLL
               [D? ] EXT-MS-WIN-KERNELBASE-PROCESSTHREAD-L1-1-0.DLL
               [D? ] EXT-MS-WIN-ADVAPI32-NPUSERNAME-L1-1-0.DLL
               [D? ] EXT-MS-WIN-APPXDEPLOYMENTCLIENT-APPXDEPLOY-L1-1-0.DLL
               [D? ] EXT-MS-WIN-APPXDEPLOYMENTCLIENT-APPXDEPLOYONECORE-L1-1-0.DLL
               [D? ] EXT-MS-WIN-COM-PSMREGISTER-L1-2-1.DLL
          [ ? ] API-MS-WIN-CORE-PROCESSTHREADS-L1-1-3.DLL
          [ ? ] API-MS-WIN-CORE-PROCESSTHREADS-L1-1-2.DLL
          [ ? ] API-MS-WIN-CORE-REGISTRY-L1-1-0.DLL
          [ ? ] API-MS-WIN-CORE-HEAP-L1-2-0.DLL
          [ ? ] API-MS-WIN-CORE-HEAP-L2-1-0.DLL
          [ ? ] API-MS-WIN-CORE-MEMORY-L1-1-2.DLL
          [ ? ] API-MS-WIN-CORE-ENCLAVE-L1-1-0.DLL
          [ ^6] API-MS-WIN-CORE-HANDLE-L1-1-0.DLL
               [F^6] KERNEL32.DLL
          [ E6] API-MS-WIN-CORE-SYNCH-L1-2-0.DLL
               [F^6] KERNEL32.DLL
                    [FE6] API-MS-WIN-CORE-SYNCH-L1-1-0.DLL
          [ ? ] API-MS-WIN-CORE-SYNCH-L1-2-1.DLL
          [ ? ] API-MS-WIN-CORE-FILE-L1-2-1.DLL
          [ ? ] API-MS-WIN-CORE-FILE-L1-2-2.DLL
          [ ? ] API-MS-WIN-CORE-DELAYLOAD-L1-1-1.DLL
          [ ? ] API-MS-WIN-CORE-IO-L1-1-1.DLL
          [ ? ] API-MS-WIN-CORE-JOB-L1-1-0.DLL
          [ ? ] API-MS-WIN-CORE-THREADPOOL-LEGACY-L1-1-0.DLL
          [ ? ] API-MS-WIN-CORE-THREADPOOL-PRIVATE-L1-1-0.DLL
          [ ? ] API-MS-WIN-CORE-LIBRARYLOADER-L1-2-2.DLL
          [ ? ] API-MS-WIN-CORE-LIBRARYLOADER-L1-2-0.DLL
          [ ? ] API-MS-WIN-CORE-LIBRARYLOADER-L2-1-0.DLL
          [ ? ] API-MS-WIN-CORE-NAMEDPIPE-L1-2-2.DLL
          [ ? ] API-MS-WIN-CORE-NAMEDPIPE-L1-2-0.DLL
          [ ? ] API-MS-WIN-CORE-DATETIME-L1-1-1.DLL
          [ ? ] API-MS-WIN-CORE-DATETIME-L1-1-2.DLL
          [ ? ] API-MS-WIN-CORE-SYSINFO-L1-2-1.DLL
          [ ? ] API-MS-WIN-CORE-SYSINFO-L1-2-3.DLL
          [ ^6] API-MS-WIN-CORE-TIMEZONE-L1-1-0.DLL
               [F^6] KERNEL32.DLL
          [ ? ] API-MS-WIN-CORE-LOCALIZATION-L1-2-1.DLL
          [ ? ] API-MS-WIN-CORE-PROCESSSNAPSHOT-L1-1-0.DLL
          [ ? ] API-MS-WIN-CORE-PROCESSENVIRONMENT-L1-2-0.DLL
          [ ^6] API-MS-WIN-CORE-STRING-L1-1-0.DLL
               [F^6] KERNEL32.DLL
          [ ? ] API-MS-WIN-CORE-DEBUG-L1-1-1.DLL
          [ ? ] API-MS-WIN-CORE-ERRORHANDLING-L1-1-1.DLL
          [ ? ] API-MS-WIN-CORE-ERRORHANDLING-L1-1-3.DLL
          [ ? ] API-MS-WIN-CORE-FIBERS-L1-1-1.DLL
          [ ^6] API-MS-WIN-CORE-PROFILE-L1-1-0.DLL
               [F^6] KERNEL32.DLL
          [ ? ] API-MS-WIN-SECURITY-BASE-L1-2-0.DLL
          [ ? ] API-MS-WIN-SECURITY-APPCONTAINER-L1-1-0.DLL
          [ ? ] API-MS-WIN-CORE-COMM-L1-1-0.DLL
          [ ? ] API-MS-WIN-CORE-REALTIME-L1-1-0.DLL
          [ ? ] API-MS-WIN-CORE-WOW64-L1-1-1.DLL
          [ ? ] API-MS-WIN-CORE-WOW64-L1-1-0.DLL
          [ ? ] API-MS-WIN-CORE-PROCESSTOPOLOGY-L1-2-0.DLL
          [ ? ] API-MS-WIN-CORE-NAMESPACE-L1-1-0.DLL
          [ ? ] API-MS-WIN-CORE-FILE-L2-1-2.DLL
          [ ? ] API-MS-WIN-CORE-FILE-L2-1-1.DLL
          [ ? ] API-MS-WIN-CORE-XSTATE-L2-1-0.DLL
          [ ? ] API-MS-WIN-CORE-LOCALIZATION-L2-1-0.DLL
          [ ? ] API-MS-WIN-CORE-NORMALIZATION-L1-1-0.DLL
          [ ? ] API-MS-WIN-CORE-FIBERS-L2-1-1.DLL
          [ ? ] API-MS-WIN-CORE-LOCALIZATION-PRIVATE-L1-1-0.DLL
          [ ? ] API-MS-WIN-CORE-SIDEBYSIDE-L1-1-0.DLL
          [ ? ] API-MS-WIN-CORE-APPCOMPAT-L1-1-1.DLL
          [ ? ] API-MS-WIN-CORE-WINDOWSERRORREPORTING-L1-1-0.DLL
          [ ^6] API-MS-WIN-CORE-CONSOLE-L1-1-0.DLL
               [F^6] KERNEL32.DLL
          [ ? ] API-MS-WIN-CORE-CONSOLE-L2-1-0.DLL
          [ ? ] API-MS-WIN-CORE-PSAPI-L1-1-0.DLL
          [ ? ] API-MS-WIN-CORE-PSAPI-ANSI-L1-1-0.DLL
          [  6] API-MS-WIN-EVENTING-PROVIDER-L1-1-0.DLL
               [F 6] ADVAPI32.DLL
                    [  6] MSVCRT.DLL
                         [ ^6] NTDLL.DLL
                         [ ^6] API-MS-WIN-CORE-CONSOLE-L1-1-0.DLL
                              [F^6] KERNEL32.DLL
                         [ ? ] API-MS-WIN-CORE-DATETIME-L1-1-1.DLL
                         [ ? ] API-MS-WIN-CORE-DEBUG-L1-1-1.DLL
                         [ ? ] API-MS-WIN-CORE-ERRORHANDLING-L1-1-1.DLL
                         [ ? ] API-MS-WIN-CORE-FIBERS-L1-1-1.DLL
                         [ ? ] API-MS-WIN-CORE-FILE-L1-2-1.DLL
                         [ ^6] API-MS-WIN-CORE-HANDLE-L1-1-0.DLL
                              [F^6] KERNEL32.DLL
                         [ ? ] API-MS-WIN-CORE-HEAP-L1-2-0.DLL
                         [ ? ] API-MS-WIN-CORE-LOCALIZATION-L1-2-1.DLL
                         [ ? ] API-MS-WIN-CORE-LIBRARYLOADER-L1-2-0.DLL
                         [ ? ] API-MS-WIN-CORE-MEMORY-L1-1-2.DLL
                         [ ? ] API-MS-WIN-CORE-NAMEDPIPE-L1-2-0.DLL
                         [ ? ] API-MS-WIN-CORE-PROCESSENVIRONMENT-L1-2-0.DLL
                         [ ? ] API-MS-WIN-CORE-PROCESSTHREADS-L1-1-2.DLL
                         [ ^6] API-MS-WIN-CORE-PROFILE-L1-1-0.DLL
                              [F^6] KERNEL32.DLL
                         [ ^6] API-MS-WIN-CORE-STRING-L1-1-0.DLL
                              [F^6] KERNEL32.DLL
                         [ E6] API-MS-WIN-CORE-SYNCH-L1-2-0.DLL
                              [F^6] KERNEL32.DLL
                         [ ? ] API-MS-WIN-CORE-SYSINFO-L1-2-1.DLL
                         [ ^6] API-MS-WIN-CORE-UTIL-L1-1-0.DLL
                              [F^6] KERNEL32.DLL
                                   [F^6] NTDLL.DLL
                         [ ^6] KERNELBASE.DLL
                         [F^6] NTDLL.DLL
                    [ ^6] NTDLL.DLL
                    [ E6] API-MS-WIN-EVENTING-CONTROLLER-L1-1-0.DLL
                         [F^6] ADVAPI32.DLL
                    [ ? ] API-MS-WIN-EVENTING-CONSUMER-L1-1-0.DLL
                    [ ^6] KERNELBASE.DLL
                    [  6] SECHOST.DLL
                         [ ^6] NTDLL.DLL
                         [ ? ] API-MS-WIN-CORE-LIBRARYLOADER-L1-2-0.DLL
                         [ ^6] RPCRT4.DLL
                         [ ? ] API-MS-WIN-CORE-CRT-L1-1-0.DLL
                         [ ? ] API-MS-WIN-CORE-THREADPOOL-L1-2-0.DLL
                         [ ? ] API-MS-WIN-CORE-FILE-L1-2-1.DLL
                         [ ? ] API-MS-WIN-CORE-IO-L1-1-1.DLL
                         [ ? ] API-MS-WIN-CORE-DEBUG-L1-1-1.DLL
                         [ ? ] API-MS-WIN-CORE-ERRORHANDLING-L1-1-1.DLL
                         [ ^6] API-MS-WIN-CORE-HANDLE-L1-1-0.DLL
                              [F^6] KERNEL32.DLL
                         [ ? ] API-MS-WIN-CORE-HEAP-L1-2-0.DLL
                         [ ? ] API-MS-WIN-CORE-REGISTRY-L1-1-0.DLL
                         [ ? ] API-MS-WIN-CORE-HEAP-OBSOLETE-L1-1-0.DLL
                         [ ? ] API-MS-WIN-CORE-MEMORY-L1-1-2.DLL
                         [ ? ] API-MS-WIN-CORE-PROCESSTHREADS-L1-1-2.DLL
                         [ ^6] API-MS-WIN-CORE-STRING-L1-1-0.DLL
                              [F^6] KERNEL32.DLL
                         [ E6] API-MS-WIN-CORE-SYNCH-L1-2-0.DLL
                              [F^6] KERNEL32.DLL
                         [ ? ] API-MS-WIN-CORE-SYSINFO-L1-2-1.DLL
                         [ ? ] API-MS-WIN-CORE-WOW64-L1-1-0.DLL
                         [ ? ] API-MS-WIN-SECURITY-BASE-L1-2-0.DLL
                         [ ? ] API-MS-WIN-CORE-APIQUERY-L1-1-0.DLL
                         [ ? ] API-MS-WIN-CORE-DELAYLOAD-L1-1-1.DLL
                         [D? ] EXT-MS-WIN-EVENTING-RUNDOWN-L1-1-0.DLL
                         [D? ] EXT-MS-WIN-SECURITY-CHAMBERS-L1-1-0.DLL
                         [D^6] CRYPTBASE.DLL
Run Code Online (Sandbox Code Playgroud)

vre*_*vre 5

当 Qt 构建为 DLL 时,D:\Qt\5.9\msvc2015_64\lib\cmake 中的文件只能找到导入库。连同包含文件,这些文件足以让编译器和链接过程解决开放的依赖关系。您必须将 Qt D:\Qt\5.9\msvc2015_64\bin 和 D:\Qt\5.9\msvc2015_64\plugins\platforms 的二进制目录添加到环境中,方法是将其附加到 PATH 变量中。

PATH=D:\Qt\5.9\msvc2015_64\bin;D:\Qt\5.9\msvc2015_64\plugins\platforms;%PATH%

为了在 Visual Studio 中进行测试,您可以在 Environment 的 Configuration Properties Debugging 部分下添加此设置。转到解决方案资源管理器,右键单击项目(示例中的“测试”)并选择属性以显示配置属性。请参见使用项目属性

如果您稍后使用 CMake/CPack 为您的项目构建安装程序,则 Qt Windows 部署工具可以方便地识别分发所需的 Qt DLL。查看Qt 部署