如果 运行 来自 cmd.exe 但不是来自 Qt Creator,则基于 Qt 的 C++ 项目有效

Qt-Based C++ Project Works If Run From cmd.exe But Not From Within Qt Creator

我正在为 Windows(仅 Windows 编写一个基于 Qt 的非常小的 C/C++ 应用程序,它使用 VISA 库(visa64.dll) 与一些外部硬件对话。反过来,该库使用其他一些库:

(来自 Dependency Walker a.k.a 的屏幕截图。depends.exe)

最初是我在 Visual Studio 中写的,效果很好。然后我将它移植到 Qt Creator(使用 Qt5,带 MSVC 2015 Visual C++ 工具链),我得到了 运行 时间错误。它知道在哪里可以找到外部头文件,所以我认为我的 INCLUDEPATH 是正确的,而且它构建得很好所以我认为我的 .pro 文件中的 LIBS 变量是正确的,也就是说它可以找到它需要的 .lib 文件。但是,我从这个外部库 (viOpenDefaultRM) returns 调用的第一个 API 出现以下错误:VI_ERROR_LIBRARY_NFOUND。无论我制作调试版本还是发布版本,以及是否使用调试器 运行 都会发生这种情况。只要我从 Qt Creator 中 运行 程序,它就会出现 运行 时间错误。

这是我的 .pro 文件:

TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += main.cpp

INCLUDEPATH += $$PWD/'../../../../Program Files/IVI Foundation/VISA/Win64/Include'

LIBS += -L$$PWD/'../../../../Program Files/IVI Foundation/VISA/Win64/Lib_x64/msc/' -lvisa64

INCLUDEPATH += $$PWD/'../../../../Program Files/IVI Foundation/VISA/Win64/Include'
DEPENDPATH += $$PWD/'../../../../Program Files/IVI Foundation/VISA/Win64/Include'

/Include结尾的路径有头文件(.h)(它是一个C库),以/msc结尾的路径有一个.lib文件。 .lib 文件不是静态库,它们是一些相应的 DLL 的接口文件。这些 DLL 文件在 C:\System32 中。 C:\SysWOW64 中也有 32 位版本。它们也可能存在于其他地方,但如果它们存在我不知道。

现在,如果我从 cmd.exe 运行 它工作正常。也就是说,如果我打开 cmd.exe 终端 window 并导航到我的 Qt 项目的构建目录 (c:\blah\blah\blah\obj\debug\) 和 运行 来自 cmd.exe 的可执行文件,我得到没有 运行 时间错误。可以连接外接硬件,跟它对话,万事如意,大喜过望。

我已经对这个问题进行了大量的搜索和研究,我有点被诅咒的事实是大多数人都有相反的问题,这意味着 那个 问题(我的对面)出现在 Google/DuckDuckGo/Whosebug/forum.qt.io/doc.qt.io 搜索中。该问题通常与 missing/misplaced Qt 库有关。 Here is an example. The answer to this question usually ends up with a link to a page on how to deploy Qt projects for Windows, e.g. this article.

我还阅读了 this 来自 Qt 的关于如何将库添加到您的项目的文章,它对我没有帮助,但我可能遗漏了一些东西 and/or 做错了.

这可能是我所缺少的一些非常愚蠢的东西,坦率地说,我希望它是。谢谢*10^6.

TL;DR: 我用来在 Qt Creator 中编译的套件与我的系统 PATH 有不同的 PATH 设置。为了解决这个问题,我在 cmd.exe 中做了 echo %PATH 并将与我尝试使用的驱动程序有关的所有内容复制到我正在使用的套件的 PATH 中Qt 创造者。下面有更多详细信息。

我今天早上开始工作了。正如@adrien-lerevat 所建议的那样,当 Qt Creator 中的 运行 时,我的可执行文件找不到它需要的一些 DLL。总而言之,我在我的工具包中定义了一个 PATH(Qt 中的“工具包”基本上是一个编译器、一个调试器和一些环境变量),它不同于 不是 我的正常系统路径的超集。我从其他项目继承了这个套件用于其他目的,你看,我没有意识到可以在其中设置 PATH,或者我正在设置一个。因此,为了找到我为 Qt Creator 设置的 PATH,我转到 Tools 下拉菜单并选择 Options...,然后选择 Build & Run,然后选择 Kits。然后单击您正在使用的工具包进行编辑。像这样:

那应该给你一个东西清单,其中一个叫做 Environment。那应该有一个 Change... 按钮,你可以按:

这应该会打开一个新的 window,其中包含您所有的环境内容:

(截图来自我修复问题后)

这是我发现 PATH 以及一些值得了解的库和包含路径的地方。所以现在我知道我的 Qt Creator PATH 是什么,我打开 cmd.exe 并输入命令 echo %PATH% 来找出我的系统 PATH 是什么。我抓取了与我正在使用的这些 VISA 驱动程序有关的所有内容(基本上是路径中带有 VISA and/or IVI Foundation 的所有内容)并将它们粘贴到 Qt 中的 PATH造物主。这是我粘贴在那里以使其正常工作的内容列表:

C:\WINDOWS\system32;C:\Program Files\IVI Foundation\VISA\Win64\ktvisa;C:\Program Files\IVI Foundation\VISA\Win64\bin;C:\Program Files (x86)\IVI Foundation\VISA\WinNT\bin;C:\Program Files (x86)\IVI Foundation\VISA\WinNT\Bin\;C:\Program Files\IVI Foundation\VISA\Win64\Bin\;C:\Program Files (x86)\IVI Foundation\VISA\winnt\agvisa;C:\Program Files\Keysight\IO Libraries Suite\bin;C:\Program Files (x86)\Keysight\IO Libraries Suite\bin;C:\Program Files (x86)\IVI Foundation\VISA\WinNT\ktvisa;C:\Program Files (x86)\IVI Foundation\IVI\bin;C:\Program Files\IVI Foundation\IVI\bin;

我添加了 c:\system32,因为我知道那是 visa64.dll 所在的位置,这至少是一个我知道我需要的 top-level DLL。但是,奇怪的是,当我添加 just c:\system32 而没有所有 VISAIVI Foundation 东西时,它不起作用。所以,我不知道我添加到我的 Qt Creator 路径的 everything 是否有必要,因为我刚刚遇到这个解决方案,但是一旦我削减列表以找出什么我实际需要的所有信息我都会在此处添加该信息。以防万一其他人遇到这个问题或感到好奇。为了完整起见,我想。好的谢谢大家;)