1

我正在使用 Qt (4.7.0) 开发一个 Windows (7) 应用程序来调用 DLL (NI visa32.dll) 中的一些方法,以通过 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

我也尝试过使用-lvisaor -lvisa.dll,但在所有情况下,我还会收到另一个编译错误,指出-lvisa, -lvisa.aor-lvisa.dll未找到。我编辑了原始头文件“visa.h”,并在文件中的每个对象前加上 Q_DECL_IMPORT,并确保存在 extern“C”语句。

我在应用程序中包含对头文件的引用:

#include "visa.h"

请注意,编译器确实可以识别属于 visa.h 文件的引用对象。

任何解决此编译错误的帮助将不胜感激。


我还按照 Visual C++ 中的DLL References的说明尝试使用 Visual C++ (2010) 。在这种情况下,我没有收到任何编译错误,而是出现链接错误。例如:

AgiE364X.obj: error LNK2019: unresolved external symbol  
"extern "C" long __stdcall viClose(unsigned long)"  

viClose 是 NI-VISA 中被调用的方法。

不过,我更喜欢使用 Qt C++ 而不是 Visual C++。

提前致谢。

4

2 回答 2

0

NI 提供的 VISA 库有两种:一种由 编译borland c++,另一种由 编译microsoft vc++

至于Qt,你也可以使用应该编译的Qt MSVC,来链接visa32.lib编译的MSVC。并且它必须链接.lib而不是.dll,VISA 的MSVC"C:\Program Files\IVI Foundation\VISA\WinNT\lib\msc"默认在。

默认情况下包含目录C:\Program Files\IVI Foundation\VISA\WinNT\include

其实以上信息在你安装好设备驱动后,可以从VISA的例子中得知。

于 2013-02-25T12:54:24.173 回答
0

我不确定,因为我自己是 Qt 的新手,但这里有一些猜测:我注意到你在 INCLUDEPATH 字符串中有一个空格。此外,LIBS += -Lvisa/lib 有一个大写字母 L(这是正确的吗?)。我不是说这是你的问题,但也许值得一试。最后想到的是,如果您使用 Qt Creator 仅部分键入 #include "visa.h" 并查看自动完成是否可以为您完成它。如果可以,那么其余的都可以。使用 Ctrl+Space 触发自动完成。我注意到,当我弄乱路径时,自动完成是一种很好的衡量标准。

于 2011-02-16T20:29:26.853 回答