首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于Qt的C++项目如果从cmd.exe运行,而不在中运行,则可以工作。

基于Qt的C++项目如果从cmd.exe运行,而不在中运行,则可以工作。
EN

Stack Overflow用户
提问于 2020-08-12 00:55:13
回答 1查看 204关注 0票数 0

我正在为Windows编写一个非常小的基于C/C++ Qt的应用程序(只有Windows --一点也不跨平台),它使用VISA库(visa64.dll)与一些外部硬件进行通信。反过来,该库使用了其他一些库:

(截图从依赖沃克a.k.a.depends.exe)

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

这是我的.pro文件:

代码语言:javascript
运行
复制
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库有关。这里就是一个例子。这个问题的答案通常是指向一个关于如何为Windows部署Qt项目的页面的链接,例如这篇文章

此外,我还阅读了Qt中关于如何向项目添加库的文章,这并没有帮助我,但我可能遗漏了一些东西并/或做错了。

这可能是我错过的很愚蠢的事情,坦白地说,我希望是这样。谢谢*10^6。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-12 20:38:01

TL;DR: --我在Qt中编译的工具包--与我的系统PATH有不同的PATH集。为了解决这个问题,我在cmd.exe中使用了cmd.exe,并将与驱动程序相关的所有内容复制到了我在Qt中使用的工具包的PATH中。下面是更多的细节。

我今天早上要把这个弄到手。正如@adrien所建议的,当从suggested内部运行时,我的可执行文件无法找到它需要的一些DLL。它的长短在于,我在我的工具包中定义了一个PATH ( Qt中的" kit“基本上是一个编译器、一个调试器和一些环境变量),它与我的正常系统路径不同,而不是超集。您知道,我从其他项目继承了这个工具包,但我没有意识到可以在其中设置PATH,也不知道我正在设置一个。因此,为了找到我为Qt设置的PATH,我选择了Tools下拉列表,选择了Options...,然后选择了Build & Run,然后选择了Kits。然后单击用于编辑它的工具包。因此:

这应该会给你一个东西的列表,其中有一件事叫做Environment。应该有一个Change...按钮,您可以按:

它应该打开一个新窗口,其中包含了您所有的环境内容:

(截图来自I修复了这个问题后)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63368262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档