Accessing NI-VISA from Qt C++ 4.7

6k views Asked by At

I am developing a Windows (7) application using Qt (4.7.0) to call some methods in a DLL (NI visa32.dll) to communicate with instruments through the GPIB port. The manufacturer's header file is also available (visa.h).

In the project file, I tried adding the path and library reference to the original places where the files are located at as:

INCLUDEPATH += "C:/Program Files/National Instruments/Shared/CVI/Include"  
LIBS        += "C:/Windows/System32/visa32.dll"

but, I get the compilation error:

collect2: ld returned 1 exit status

Following the instructions in Importing a DLL into Qt, I created a "visa.a" from the "visa32.dll", and copied them to a subfolder "visa/lib", and added the path and library to the project file:

INCLUDEPATH += visa/include  
LIBS        += -Lvisa/lib  
LIBS        += -lvisa.a

I tried also with -lvisa or -lvisa.dll, but in all the cases I get also another compilation error saying that the -lvisa, -lvisa.a or -lvisa.dll is not found. I edited the original header file "visa.h", and prefixed with Q_DECL_IMPORT every object in the file, and also made sure that the extern "C" statement be present.

I include the reference to the header file in the application as:

#include "visa.h"

and note that the compiler does recognize the referenced objects belonging to the visa.h file.

Any help to solve this compilation error will be greatly appreciated.


I also tried with Visual C++ (2010) following the instructions of DLL References in Visual C++. In this case, I do not get any compilation error, but linking errors. For example:

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

being viClose a called method in NI-VISA.

I would prefer to use Qt C++ instead of Visual C++, though.

Thanks in advance.

2

There are 2 answers

5
user440297 On

I'm not sure since I'm new to Qt myself but here are some guesses: I noticed you have a space in INCLUDEPATH string. Also, LIBS += -Lvisa/lib has a capitol L (is this correct?). I'm not saying this is your problem but perhaps worth a try. The last thing that comes to mind is that if you're using Qt Creator only partially type #include "visa.h" and see if auto complete can complete it for you. If it can, than prob the rest is OK. Trigger auto-complete with Ctrl+Space. I've noticed that when I mess up the paths auto-complete is a good gauge for this sort of thing.

0
Tody.Lu On

There are two types of library of VISA provided by NI: the one is compiled by borland c++, the other is compiled by microsoft vc++.

As for Qt, you can use Qt which should be compiled by MSVC, to link the visa32.lib which is compiled by MSVC too. And it MUST link .lib instead of .dll, The MSVC library of VISA is in "C:\Program Files\IVI Foundation\VISA\WinNT\lib\msc" by default.

The include directory is C:\Program Files\IVI Foundation\VISA\WinNT\include by default.

In fact, the above information can be known from VISA example after you install the device driver.