C++ QT从资源/指定路径加载dll

C++ QT从资源/指定路径加载dll,c++,qt,dll,C++,Qt,Dll,我创建了一个QT应用程序,在运行时需要两个DLL文件来解析其中的一些函数 我有两个问题: 1) 我可以将这些文件添加到QT资源中,使应用程序直接从资源加载它们,而不提取到本地路径吗 2) 如果答案是“否”;如何添加路径以使应用程序在中搜索DLL 注意:dll文件的名称存储在与应用程序一起编译的“.a”库中 编辑: 我的情况如下: 假设我使用“-openssl运行时”从源代码静态构建了MingW QT 5.13.1 现在,我们使用该MingW构建的每个应用程序都将在同一个exe目录中搜索libcr

我创建了一个QT应用程序,在运行时需要两个DLL文件来解析其中的一些函数

我有两个问题:

1) 我可以将这些文件添加到QT资源中,使应用程序直接从资源加载它们,而不提取到本地路径吗

2) 如果答案是“否”;如何添加路径以使应用程序在中搜索DLL

注意:dll文件的名称存储在与应用程序一起编译的“.a”库中

编辑:

我的情况如下:

假设我使用“-openssl运行时”从源代码静态构建了MingW QT 5.13.1

现在,我们使用该MingW构建的每个应用程序都将在同一个exe目录中搜索
libcrypto-1_1.dll
&
libssl-1_1.dll
,但应用程序可以在没有它们的情况下运行,但在请求
https
url时,只会遇到
TLS初始化失败


我可以让应用程序从资源加载DLL,还是强制应用程序在其他路径中搜索DLL?

首先,区分加载外部库的不同方式很重要。基本上:

  • 作为在编译时链接到应用程序中的共享库
  • 在运行时加载的库。例如,对于Qt,这可以是带有或作为
  • 对于#1,当应用程序运行时,在任何代码运行之前,链接库需要在启动时可用。第一个问题的答案肯定是否定的。至于它应该放在哪里,最简单的方法是把它放在与依赖它的可执行文件相同的文件夹中。之后,如果你想支持不同的OSs,事情会变得复杂。。。Windows有它自己的功能,而在Linux上,您可以在运行时或编译时使用它(仅举几个常见选项)


    对于#2,有更多的灵活性,包括仅在实际需要时加载库(例如,这可以缩短应用程序的启动时间)。它们几乎可以位于您选择的任何位置(例如,应用程序发行版的子文件夹)。但是,我不知道在资源文件中。。。我从来没有见过有人提到或尝试过。我猜不是,但这可能是一个有趣的实验!:)

    此库是一个在编译时链接的共享库,但exe在应用程序完成运行后的运行时执行它(即:它不需要位于同一个exe文件夹中,仅当应用程序从中执行代码时才需要),如
    QT-openssl runtime
    @John我不太清楚您的意思。如果它是在编译时链接的,则需要加载它才能启动应用程序。如果是在应用程序启动后加载的库,则不会加载。如果“QT-openssl runtime”是指QT build config选项,那么这正是它所做的——将QT配置为在应用程序启动后在运行时加载openssl libs,而不是在构建QT时链接到libs。我的意思是dll行为类似于
    -openssl运行时
    。应用程序可以运行,而不需要dll位于同一目录中,但当应用程序希望从dll执行函数时,应用程序需要dll位于路径中。dll执行不是
    QLibrary
    ,而是在应用程序编译的“.a”库中。我尝试了
    setdldirectory
    ,它返回
    true
    ,但同样的问题仍然存在existing@John,抱歉,现在我更困惑了:)听起来很像您所说的lib是在运行时加载的(可能是像
    LoadLIbrary
    ?)之类的WinAPI,而不是在编译时链接的。否则,应用程序根本就无法启动。但是“用应用程序编译的in.a lib”让我觉得您可能在谈论静态链接(使用MinGW/gcc?)。听起来好像你已经有了它的工作方式,所以你可能应该张贴一个你现在拥有的和你正在尝试做的例子。或者其他人会更好地理解。我编辑了这个问题,并为我的问题添加了一个示例,很抱歉不清晰。如果它是一个.a库,它不是一个静态链接库吗?了解应用程序在哪个操作系统上工作也很有用。您同时谈论DLL和.a libs,这听起来很混乱。通过“.a”lib,我指的是静态“.lib”文件井,编辑后的内容更清晰。我所能告诉您的是,这些lib的搜索路径要么隐藏在Qt配置中的某个地方,要么简单到使用
    QCoreApplication::addLibraryPath()
    将路径添加到lib所在的位置。最简单的方法是将它们放在与可执行文件相同的文件夹中。我知道是否在同一文件夹中添加了dll,但我想将它们放在另一个文件夹中
    QCoreApplication::addLibraryPath()
    没有解决问题;同样的结果