如果从cmd.exe运行而不是从Qt Creator内部运行,则基于Qt的C ++项目可以工作

问题描述

我正在为Windows(仅Windows-根本没有跨平台)编写一个非常小的基于Qt的C / C ++应用程序,该应用程序使用VISA库(visa64.dll)与某些外部硬件进行通讯。该库又使用其他一些库:

Screenshot from Dependency Walker/depends.exe

(Dependency Walker的屏幕快照,也称为Depends.exe)

最初,我在Visual Studio中编写了它,效果很好。然后我将其移植到Qt Creator(使用Qt5,带有MSVC 2015 Visual C ++工具链),但出现运行时错误。它知道在哪里可以找到外部头文件,因此我认为我的INCLUDEPATH是正确的,并且构建良好,所以我认为.pro文件中的LIBS变量是正确的,也就是说它可以找到所需的.lib文件。但是,我从该外部库(viOpenDefaultRM调用的第一个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终端窗口并导航到Qt项目的生成目录(c:\blah\blah\blah\obj\debug\),然后从cmd.exe运行可执行文件,则不会出现运行时错误。它可以连接到外部硬件,与之交谈,所有美好的事情正在发生,令人非常高兴。

我已经对这个问题进行了大量的搜索和研究,而大多数人却遇到了相反的问题,这意味着那个问题(与我的)是在Google / DuckDuckGo / StackOverflow / forum.qt.io / doc.qt.io搜索中出现的。这个问题通常与Qt库丢失/放错位置有关。 Here一个示例。这个问题的答案通常以指向如何在Windows上部署Qt项目的页面链接结尾,例如this article

我还读过Qt的this文章内容涉及如何向您的项目中添加库,但这并没有帮助我,但是我可能会遗漏某些东西和/或做错了事。

这可能是我真正想不到的东西,但坦率地说,我希望是。谢谢* 10 ^ 6。

解决方法

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

今天早上我得到了这个。正如@ adrien-lerevat所建议的那样,当从Qt Creator中运行时,我的可执行文件找不到所需的某些DLL。总而言之,就是我在我的工具包(Qt中的“工具包”基本上是编译器,调试器和一些环境变量)中定义了一个PATH,与 是我的正常系统路径的超集。您看到,我已经从其他项目继承了该工具包的其他用途,但是我没有意识到可以在其中设置PATH,或者我正在设置一个。因此,要找到我为Qt Creator设置的PATH,我转到了Tools下拉菜单,依次选择Options...,然后依次选择Build & RunKits。然后单击您要用来编辑它的工具包。因此: enter image description here

enter image description here

这应该给您列出所有内容,其中一个称为Environment。那应该有一个Change...按钮,您可以按下: enter image description here

这将打开一个包含您所有环境内容的新窗口: enter image description here

(屏幕截图来自我已解决问题的之后)

这是我找到PATH的地方,还有一些库,其中包含值得了解的路径。因此,现在我知道我的Qt Creator PATH是什么了,我打开cmd.exe并键入命令echo %PATH%来找出我的系统PATH是什么。我抓住了与我正在使用的VISA驱动程序有关的所有内容(基本上是路径中带有VISA和/或IVI Foundation的所有内容),并将它们粘贴到Qt Creator中的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所在的地方,它至少是我知道我需要的一个顶级DLL。不过,奇怪的是,当我添加 just c:\system32而没有所有VISAIVI Foundation的东西时,那是行不通的。因此,我不知道添加到Qt Creator路径中的一切是否必要,因为我刚刚遇到了这种解决方案,但是一旦我缩减列表以找出我真正想要的是什么,需要,我将在此处添加该信息。以防万一其他人遇到这个问题或感到好奇。为了完整起见,我想。好的,谢谢大家;)