【问题标题】:Linker error "... .obj : error LNK2019: unresolved external symbol referenced in function"链接器错误“... .obj:错误 LNK2019:函数中引用的未解析的外部符号”
【发布时间】:2013-04-12 23:12:30
【问题描述】:

对于同一个链接器问题,我已阅读所有先前的回复或解决方案。我了解链接器无法访问已定义函数的库文件,但我仍然无法解决它!

错误:

1>trial_12th.obj : error LNK2019: unresolved external symbol _viStatusDesc@12 referenced in function _main
1>trial_12th.obj : error LNK2019: unresolved external symbol _viClose@4 referenced in function _main
1>trial_12th.obj : error LNK2019: unresolved external symbol _viRead@16 referenced in function _main
1>trial_12th.obj : error LNK2019: unresolved external symbol _viWrite@16 referenced in function _main
1>trial_12th.obj : error LNK2019: unresolved external symbol _viOpen@20 referenced in function _main
1>trial_12th.obj : error LNK2019: unresolved external symbol _viOpenDefaultRM@4 referenced in function _main
1>C:\Users\41kchoudhary\Documents\Visual Studio 2010\Projects\trial_12th\Debug\trial_12th.exe : fatal error LNK1120: 6 unresolved externals

我正在尝试从混合信号示波器发送和接收数据。为此,我需要使用使用 Microsoft Visual Studio C++ 定义的预定义命令/函数来编写 .cpp 文件。我已经阅读了使用这些命令的用户手册,并且我还有实现它所需的头文件和库。

我正在使用以下代码:

#include <visa.h>
#include "stdafx.h"
#include <stdio.h>
#include <memory.h>

int main(int argc, char* argv[])
{
     ViSession rm = VI_NULL, vi = VI_NULL;
     ViStatus status;
     ViChar buffer[256];
     ViUInt32 retCnt;

     // Open a default session
     status = viOpenDefaultRM(&rm);
     if (status < VI_SUCCESS) goto error;

     // Open the GPIB device at primary address 1, GPIB board 8
     status = viOpen(rm, "USB::0x0699::0x0377::C011104::INSTR", VI_NULL, VI_NULL,
     &vi);
     if (status < VI_SUCCESS) goto error;

     // Send an ID query.
     status = viWrite(vi, (ViBuf) "*idn?", 5, &retCnt);
     if (status < VI_SUCCESS) goto error;

     // Clear the buffer and read the response
     memset(buffer, 0, sizeof(buffer));
     status = viRead(vi, (ViBuf) buffer, sizeof(buffer), &retCnt);
     if (status < VI_SUCCESS) goto error;

     // Print the response
     printf("id: %s\n", buffer);

     // Clean up
     viClose(vi); // Not needed, but makes things a bit more

     // understandable
     viClose(rm); // Closes resource manager and any sessions

     // opened with it
     return 0;

     error:
         // Report error and clean up
             viStatusDesc(vi, status, buffer);
             fprintf(stderr, "failure: %s\n", buffer);
             if (rm != VI_NULL) {
                 viClose(rm);
             }
             return 1;
}

【问题讨论】:

  • 您是否包含了 .lib 文件?
  • 您忘记链接包含那些 Vi* 符号的库。
  • 这可能是 32 位与 64 位的问题(假设 .lib 文件已添加到项目中)。我也有这个问题。我按照手册中的说明解决了这个问题,TDS2000 系列的第 5-2 页,从头开始创建一个新项目(例如,不转换 .dsw 项目 - 这很可能是由于获得了 64 位应用程序/项目) : 不使用预编译头文件,项目模板“Win32 Console Application”的“Win32”等

标签: c++ linker


【解决方案1】:

您需要将 visa32.lib 或 visa64.lib 添加到链接器设置中。

一种方法是在编译器源文件中使用编译指示:

#pragma comment(lib,"visa32.lib")

如果仍未找到,则在 IDE 中调整 lib 路径或在编译指示中包含完整路径。

【讨论】:

  • @ArgumentNullException: 我已将 .lib 文件包含在以下项目 -> 属性 -> 链接器 -> 输入 -> 附加依赖项
  • @Haroogan:我想我已经包含了上面评论的 .lib 文件
  • 你需要在你的机器上的某个地方找到 visa32.lib。它通常位于 IVI Foundation 的某个程序文件文件夹下的子文件夹中。无论它位于哪个文件夹都需要在项目的库文件夹列表中或 Visual Studio 的 list of library folders 中,或者您可以使用完整路径指定 visa23.lib。
  • 我已经在我的项目中包含了 visa32.lib 文件的路径,但它仍然不起作用:((文件路径:IVI Foundation -> VISA -> Win64 -> Lib_x64 -> msc - > visa32.lib)
  • 该文件夹应该用于 64 位库。使用IVI Foundation\VISA\WinNT\lib\msc下的那个。
【解决方案2】:

我有同样的问题。我发现您必须在项目的链接器属性下的附加依赖项中添加 visa32.lib

去你的

项目属性->链接器->附加依赖->点击向下箭头->“编辑->输入visa32.lib

点击确定,确定

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    相关资源
    最近更新 更多