【问题标题】:Compiled app wants to load DLL from absolute path编译后的应用程序想要从绝对路径加载 DLL
【发布时间】:2014-01-04 13:49:30
【问题描述】:

你好,我的小 DLL 地狱!

我编写了一个基于 C++/Qt 的应用程序,它还使用 QCA - Qt 加密架构。从那里可以通过libqca.dll 获得基本的东西,更多的东西比如解密是由单独的插件提供的。 QCA 通过 cmake、make、make install 编译。 它在 Qt 安装目录中安装 DLL 和 mkspec 功能。

在编译 QCA 和我的应用程序后,它运行良好。但是,当我在另一台没有任何开发内容的计算机上安装此应用程序时,在运行时未加载提供 AES 解密的附加 libqca-ossl.dll

Dependency Walker 透露,我的应用正在尝试从此处加载后一个 DLL:

C:/Qt/4.8.4/plugins/crypto/libqca-ossl.dll

这是安装在开发计算机上的路径。显然,此路径在其他计算机上不存在。当我在另一台机器上创建此路径并将 DLL 放入其中时,它已被加载。 这两个所需的 DLL 都已驻留在 EXE 的目录中,应该可以在那里找到。

在我看来,DLL 的绝对安装路径以某种方式硬编码到应用程序中。 如何让我的应用程序找到位于 EXE 旁边的 DLL?

【问题讨论】:

  • 你是如何在你的 exe 上为这个 dll 编译 lib 的?
  • 鉴于上述简短的编译过程,我不确定我是否在关注您。您能否更准确地说一下,您需要什么样的信息?
  • @AndreasN,请提供您的 .pro 文件的相关摘录
  • 为了完整起见:我只是在我的 .pro 文件中说 win32:CONFIG += crypto。这包括来自 QTDIR/mkspecs/features 路径的 crypto.prf。它的内容在来自 KDE git 存储库的文件 crypto.prf.in(最后 10 行)中(请参阅我最初帖子中的链接)。

标签: c++ windows qt dll path


【解决方案1】:

请参阅“它是如何工作的?”在QCA project home page:

加密功能在运行时确定,插件从 Qt 库路径的“加密”子文件夹加载。

所以你描述的行为符合预期。

要使其工作,您需要在运行时更改 Qt 库路径文件夹,或者使用 QCA::InsertProvider 明确插入所需的提供程序,如 described in the documentation。后者可能更可取,因为它更本地化。更改库路径可能会给应用程序的其余部分带来副作用,或者与其他第三方库发生冲突。

【讨论】:

  • 我接受这个答案,因为它帮助我解决了问题。显然,我忽略了文档中的一些重要内容。关于“加密”子文件夹的引用打开了灯。由于 EXE 路径位于 QApplication::libraryPaths() 中,因此将“crypto”子文件夹及其 libqca-ossl.dll 复制到应用程序的 EXE 路径中就足够了。需要注意的是,来自 OpenSSL 安装的 libeay32.dll 和 ssleay32.dll 也需要在 EXE 路径中。谢谢大家。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 2017-05-29
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
相关资源
最近更新 更多