【问题标题】:LNK2019: Unresolved external symbol __imp__ in the .obj file in Line 1LNK2019:第 1 行的 .obj 文件中未解析的外部符号 __imp__
【发布时间】:2017-01-22 18:55:17
【问题描述】:

我不确定出了什么问题。我将描述这个问题,然后是我对正在发生的事情的理解。这是一个简单的代码:

#include <iostream>
#include <stdio.h>
#include "stdafx.h"
#include <iViewNG-Core.h>

int main(int argc, char ** args) {

    iViewVersion version;
    iViewRC rc = iView_GetLibraryVersion(&version);

    if (RC_NO_ERROR != rc)
        printf("ERROR returned by iView_GetLibraryVersion(): %d\n", rc);

    printf("The version of the libiViewNG is: %u.%u.%u.%u\n", version.major, version.minor, version.patch, version.build);

    return 0;
}

错误描述:

错误 LNK2019 未解析的外部符号 __imp__iView_GetLibraryVersion@4 在函数 _main SMI_TrialTests c:\Users\Rakshit\documents\visual studio 2015\Projects\SMI_TrialTests\SMI_TrialTests\SMI_TrialTests.obj 中引用

我确认代码确实在读取 iViewNG-Core.h,因为自动填充让我可以使用文件中声明的函数。我通过在适当的 VC++ 目录中正确添加 lib 和 include 目录来做到这一点。由于这是一个链接器问题,我哪里出错了?

我是 C++ 新手,我知道有大量重复的 LNK2019 问题,但似乎没有一个能解决我的问题。

链接器输出:

/OUT:"c:\users\rakshit\documents\visual studio 2015\Projects\SMI_TrialTests\Debug\SMI_TrialTests.exe" /MANIFEST /NXCOMPAT /PDB:"c:\users\rakshit\documents\visual studio 2015\Projects\SMI_TrialTests\Debug\SMI_TrialTests.pdb" /DYNAMICBASE “kernel32.lib” “user32.lib” “gdi32.lib” “winspool.lib” “comdlg32.lib” “advapi32.lib” “shell32.lib” “ole32.lib” “oleaut32.lib” “uuid.lib” “odbc32.lib” “odbccp32.lib” /DEBUG /MACHINE:X86 /INCREMENTAL /PGD:"c:\users\rakshit\documents\visual studio 2015\项目\SMI_TrialTests\调试\SMI_TrialTests.pgd" /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Debug\SMI_TrialTests.exe.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /VERBOSE /LIBPATH:"C:\iView NG SDK\lib\lib-Windows7-32" /TLBID:1

【问题讨论】:

  • 你能发布链接器输出,而不仅仅是错误吗?
  • 您可能想为您尝试使用的库添加标签,我不知道iViewNG-Core.h 是什么。进一步的sidenode:在C++代码中,你应该使用#include&lt;cstdio&gt;(或者最好放弃它)和std::cout &lt;&lt;而不是printf
  • 既然这是一个链接器问题,我哪里错了? -- 好吧,你不要开始看头文件,因为头文件与链接器——头文件只在编译过程中使用,你的模块编译成功。您需要向链接器指定您正在调用的函数所在的位置,可能在外部库中,
  • @RakshitKothari -- 不,DLL 仅在程序运行时使用。 “.LIB”文件在哪里?我相信您需要熟悉整个构建和运行过程。 1)编译,2)链接,3)运行。编译只创建目标文件,链接器将这些目标文件链接在一起以获得最终的可执行文件。一旦可执行文件存在,然后运行可执行文件需要它所依赖的 DLL。
  • @RakshitKothari - 好的,现在这是一个单独的问题,希望在 SO 上有一个链接。如何构建和运行没有 .LIB 文件且只有 DLL 的应用程序。简短的回答——LoadLibraryGetProcAddress。其他答案——从 DLL 构建一个 LIB 文件并使用它(不会详细说明)。

标签: c++ linker-errors


【解决方案1】:

检查符号__imp__iView_GetLibraryVersion@4,它可以分成两个块:

  • __imp_:意思是__declspec(dllimport)
  • _iView_GetLibraryVersion@4:这是实际符号,变形为 C(或 extern "C"__stdcall 符号,其中参数大小总计 4 个字节。

考虑到这一点,并通过您的代码,导致问题的函数很可能是:

extern "C" __declspec(dllimport) iViewRC __stdcall iView_GetLibraryVersion(iViewVersion*);

我建议检查包含此函数的 DLL 的 LIB 文件是否正在传递给 cllink(在前一种情况下,cl 将为您将其传递给 link)。

【讨论】:

  • 我使用了以下代码:#pragma comment (lib, "libiViewNG-LibCore.lib")
  • @RakshitKothari 这是您需要的 LIB 文件吗? ...我对 iView 并不是很熟悉,说实话,我只是花了很多空闲时间来学习如何对 MSVC 装饰符号进行解密。
猜你喜欢
  • 1970-01-01
  • 2014-11-07
  • 2013-06-01
  • 1970-01-01
  • 2022-01-06
  • 2014-09-19
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多