【问题标题】:Accessing NI-VISA from Qt C++ 4.7从 Qt C++ 4.7 访问 NI-VISA
【发布时间】:2011-06-28 14:55:10
【问题描述】:

我正在使用 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

我也尝试过使用-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++。

提前致谢。

【问题讨论】:

    标签: qt visual-c++ visa


    【解决方案1】:

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

    对于Qt,你也可以用MSVC编译的Qt,链接MSVC编译的visa32.lib。它必须链接.lib 而不是.dll,VISA 的MSVC 库默认在"C:\Program Files\IVI Foundation\VISA\WinNT\lib\msc" 中。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 嗨。感谢您的回答。 1. 在我的第一次尝试中,我使用 INCLUDEPATH += "C:/Program Files/National Instruments/Shared/CVI/Include"
      • 嗨。感谢您的回答。 1. 在我的第一次尝试中,我使用了 INCLUDEPATH += "C:/Program Files/National Instruments/Shared/CVI/Include" 但空间是通过使用引号来处理的。 2. 在我的第二次尝试中,我使用 LIBS += -Lvisa/lib 并且大写的 L 表示库路径。相反,小写 l 表示库名称。 3. include 语句正确。当我输入它时,下拉菜单会显示visa.h。我仍然得到相同的编译错误:collect2:Id 返回 1 退出状态
      • 啊。这听起来很熟悉。我不太记得了...但我想我在您的应用程序(命令行控制台)的先前运行实例打开时尝试编译时看到了该错误。确保在尝试编译之前关闭控制台。不确定您是否使用内置于控制台的 Qt creator。在这种情况下可能需要点击停止按钮(红色方块)。 Qt Creator 中有一个选项可以将控制台输出设置为实际的系统控制台。这是一个不错的选择,因为无论如何,并非所有内容都可以正确地放入内置控制台。如果制作一个 GUI 应用程序,我认为仍然存在,请确保应用程序已关闭。
      • 另外,我认为某些东西可能正在调用它认为应该存在的某些函数,但可能不存在。也许你链接的库是不够的......那就是留下来,而不是孤立无援,它需要更多的东西来工作。依赖问题?也许它假设 MS Visual Studio 环境。尝试添加#include
      • 您好 user440297。关于 Qt,我使用的是 Qt Creator (2.0.1)。该应用程序具有用户界面。在任何编译尝试期间都没有打开命令行控制台。关于 Visual C++,我添加了 Windows.h 包含语句,但我仍然得到相同的链接错误。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多