我开发使用Qt(4.7.0)来调用在DLL(NI visa32.dll)一些方法中在Windows(7)应用与通过GPIB端口仪器的通信。制造商的头文件也可用(visa.h)。
在项目文件中,我尝试将路径和库引用添加到文件所在的原始位置:
INCLUDEPATH += "C:/Program Files/National Instruments/Shared/CVI/Include"
LIBS += "C:/Windows/System32/visa32.dll"
但是,我收到了编译错误:
collect2: ld returned 1 exit status
按照Importing a DLL into Qt中的说明,我从“visa32.dll”创建了“visa.a”,并将其复制到子文件夹“visa / lib”,并将路径和库添加到项目中文件:
INCLUDEPATH += visa/include
LIBS += -Lvisa/lib
LIBS += -lvisa.a
我也试图与-lvisa
或-lvisa.dll
,但在所有的情况下,我得到的也是另一个编译错误,说,-lvisa
,-lvisa.a
或-lvisa.dll
找不到。我编辑了原始头文件“visa.h”,并在文件中的每个对象都加上了Q_DECL_IMPORT前缀,并确保存在extern“C”语句。
我在应用程序中包含对头文件的引用:
#include "visa.h"
并注意编译器确实识别属于visa.h文件的引用对象。
非常感谢任何帮助解决此编译错误。
我也按照DLL References in Visual C++的说明尝试使用Visual C ++(2010)。在这种情况下,我没有得到任何编译错误,但链接错误。例如:
AgiE364X.obj: error LNK2019: unresolved external symbol
"extern "C" long __stdcall viClose(unsigned long)"
在NI-VISA中使用viClose调用方法。
我宁愿使用Qt C ++而不是Visual C ++。
提前致谢。
答案 0 :(得分:0)
我不确定,因为我自己是Qt的新手,但这里有一些猜测:我注意到你在INCLUDEPATH字符串中有一个空格。另外,LIBS + = -Lvisa / lib有一个国会大厦L(这是正确的吗?)。我不是说这是你的问题,但也许值得一试。想到的最后一件事是,如果你使用Qt Creator只是部分键入#include“visa.h”,看看自动完成是否可以为你完成。如果可以,那么其余的就可以了。使用Ctrl + Space触发自动完成。我注意到,当我弄乱路径时,自动完成是一个很好的衡量这种事情的方法。
答案 1 :(得分:0)
NI提供两种类型的VISA库:一个是borland c++
编译的,另一个是microsoft vc++
编译的。
至于Qt,您可以使用MSVC
编译的Qt来链接由visa32.lib
编译的MSVC
。它必须链接.lib
而不是.dll
,默认情况下,MSVC
VISA库位于"C:\Program Files\IVI Foundation\VISA\WinNT\lib\msc"
。
默认情况下,include目录为C:\Program Files\IVI Foundation\VISA\WinNT\include
。
实际上,在安装设备驱动程序后,可以从VISA示例中了解上述信息。