2011-02-16 46 views
1

我正在開發一個使用Qt(4.7.0)的Windows(7)應用程序來調用DLL(NI visa32.dll)中的某些方法,以通過GPIB端口與儀器進行通信。製造商的頭文件也是可用的(visa.h)。從Qt C++ 4.7訪問​​NI-VISA

在項目文件中,我嘗試添加路徑和庫引用到的文件位於與原始的地方:

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文件中引用的對象。

任何幫助解決這個編譯錯誤將不勝感激。


我還嘗試使用Visual C++(2010)按照DLL References in Visual C++的說明進行操作。在這種情況下,我沒有收到任何編譯錯誤,但鏈接錯誤。例如:

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

是vi關閉NI-VISA中的一種調用方法。不過,我寧願使用Qt C++代替Visual C++。

在此先感謝。

回答

0

我不確定,因爲我是Qt自己的新手,但這裏有一些猜測:我注意到你在INCLUDEPATH字符串中有一個空格。另外,LIBS + = -Lvisa/lib有一個國會大廈L(這是否正確?)。我不是說這是你的問題,但也許值得一試。最後想到的是,如果您只使用Qt Creator部分類型#include「visa.h」並查看自動完成是否可以爲您完成。如果可以,比概率其餘的都好。使用Ctrl +空格觸發器自動完成。我注意到,當我搞砸路徑自動完成是一個很好的衡量這種事情。

+0

嗨。感謝您的回答。 1.我第一次嘗試使用 INCLUDEPATH + =「C:/ Program Files/National Instruments/Shared/CVI/Include」 – Fabio 2011-02-16 23:19:11

0

NI提供的VISA庫有兩種類型:一種是由borland c++編譯的,另一種是由microsoft vc++編譯的。

至於Qt,你可以使用Qt編譯MSVC,鏈接編譯MSVCvisa32.lib。它必須鏈接.lib而不是.dll,VISA的MSVC庫默認爲"C:\Program Files\IVI Foundation\VISA\WinNT\lib\msc"

默認情況下,include目錄爲C:\Program Files\IVI Foundation\VISA\WinNT\include

實際上,在安裝設備驅動程序後,可以從VISA示例中獲知上述信息。