【问题标题】:How can I get rid of the __imp__ prefix in the linker in VC++?如何摆脱 VC++ 链接器中的 __imp__ 前缀?
【发布时间】:2011-07-06 18:31:48
【问题描述】:

我正在使用 libcurl,但在 VC++ 10 中出现以下类型的链接器错误。

1>main.obj : error LNK2019: unresolved external symbol __imp__curl_easy_strerror referenced in function "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl curl_httpget(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?curl_httpget@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABV12@@Z)

如何去掉函数名前面的 imp 前缀?我正在链接到正确的库、正确的路径等。

【问题讨论】:

标签: c++ libcurl


【解决方案1】:

每当您链接到 DLL 时,都会出现 __imp__ 前缀。链接到静态链接库时不会出现。很可能生成的代码是针对 DLL 导入库链接的,但您已将其与静态库链接。

当您使用 __declspec(dllimport) 标记导入的函数时添加前缀 - 确保您的导入在未链接到 DLL 时未使用此前缀。

【讨论】:

  • 是的,我将它与静态库链接,但是如何链接到 dll 导入库(以及此选项在哪里链接到 .dll 集?)。
  • Dll 附带一个 .lib。您可以通过链接这个随附的 .lib 来链接 dll。无法通过名称知道 .lib 是静态库还是 dll“蹦床”,要知道这一点,您需要检查 .lib 内部,但 .lib 需要与您的导入匹配。
  • 谢谢@Suma!在我的情况下,有一个 ifdef 导致 __declspec(dllimport) 即使它是 dll 的依赖项。依赖项是作为静态库构建的,但这并不影响 ifdef。
【解决方案2】:

您必须在 MSVC 中的项目属性中将 CURL_STATICLIB 添加到 预处理器定义

【讨论】:

  • 就我而言,我需要#include
【解决方案3】:

您正在使用定义函数原型的头文件,说明符评估为__declspec(dllimport)

您需要重新定义对此进行评估的语句(将其设置为空),或者完全使用不同的头文件。

通常你会看到这样的代码:

#ifdef FOO_EXPORTS
#define DLLSPEC __declspec(dllexport)
#else
#define DLLSPEC __declspec(dllimport)
#endif

...

DLLSPEC bool foo(int bar);

在定义 FOO_EXPORTS 的情况下编译项目将使用一种模式,没有它将使用另一种模式。

【讨论】:

    【解决方案4】:

    如果使用向导生成的项目 - 检查 project properties -&gt; C/C++ -&gt; Code Generation 部分中的“运行时设置”值。

    默认情况下,它通常具有“多线程 DLL”值。您需要多线程 /MT 和多线程调试 /MTd 值。

    【讨论】:

    • 当我在 Visual Studio 2015 中收到错误 LINK2019 unresolved external symbol __imp_malloc 时,这有效。它会在没有 #include &lt;malloc.h&gt;#include &lt;stdlib.h&gt; 的情况下编译并崩溃,但是当我添加这些时,我得到了未解决的问题外部符号问题。
    【解决方案5】:

    正如 Suma 所说,&lt;your_library&gt;.dll 通常伴随着&lt;your_library&gt;.lib。因此,如果您收到这样的错误消息,例如

    Error LNK2019 unresolved external symbol __imp__&lt;your_symbol&gt; referenced in function ...

    强烈建议检查项目的链接器设置。

    在 Visual Studio 中,只需转到您的项目即可

    Properties -> Linker -> General
    

    并检查条目Additional Library Directories 下是否定义了&lt;your_library&gt;.lib 的路径。如果没有,请添加它。

    然后检查并定义on

    Properties -> Linker -> Input
    

    在条目Additional Dependencies 下可能缺少&lt;your_library&gt;.lib

    错误消息现在应该消失了。

    希望有帮助吗?

    【讨论】:

      猜你喜欢
      • 2015-06-05
      • 2022-10-19
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      相关资源
      最近更新 更多