Clrdump(C ++)错误LNK2019:在函数_main中引用了未解析的外部符号__imp__RegisterFilter@8

5

我正在使用一个带有pvcs编译器的makefile系统(使用Microsoft Visual C++,2008编译器),而且我正在得到一些链接错误,其形式如下:

error LNK2019:在函数_main中引用了__imp__RegisterFilter@8的未解决的外部符号

尽管使用了extern "C"声明,但仍然会发生这种情况。

extern "C" int CLRDUMP_API RegisterFilter( LPCWSTR pDumpFileName, unsigned long DumpType );

此外,在makeexe.mak文件中,库被链接为: $(COMPILEBASE)\lib\clrdump.lib \
老实说,我不是一个makefile专家,并且我正在将一个系统从Microsoft Visual C++ 6.0更改到2008。这种更改可能与链接错误有关,因为这个系统以前可以工作。
任何帮助都将不胜感激。
提前致谢,
诚挚地, Joseph
-- 编辑1 --
有人知道如何在pvcs的makefile系统中打开详细模式吗?
请注意,上述函数已经是编译器修饰版本。
__imp__RegisterFilter@8

相比之下,C++函数只是

RegisterFilter

感谢您的帮助,但如果有人能够发布更完整的解决方案,那也将非常感激。
诚挚地,Joseph
-- 编辑2 --
有位好心人发布了这个,但当我登录时它消失了:
imp前缀表示该函数是从DLL中导入的。检查CLRDUMP_API的定义 - 它是否为__declspec(dllimport)?有关更多信息,请参见本文。
曾经有一个有效的链接,但我已经丢失了,不过我想人们总是可以搜索这个话题。
谢谢你,无论你是谁!
-- 编辑3 --
感谢ChrisN(我还没有被允许投票)。尽管使用了刷新按钮,但您的答案消失了,但在我发布剪贴板后又重新出现了。
这是我对它的定义:
define CLRDUMP_API __declspec(dllimport) __stdcall

我假设__stdcall是可以的?
-- 第四次编辑 --
虽然我很感激那些回答过我的人,特别是ChrisN,但至少在我的系统上,链接错误仍然存在。如果有人有更多的见解,我将不胜感激。再次感谢。
6个回答

14

__imp_前缀表示链接器希望从动态链接库中导入此函数。

clrdump库来自此页面吗?如果是这样,请注意,库所提供的头文件中没有使用extern "C"。我使用以下命令证实了这一点:

dumpbin /exports clrdump.lib

对于 RegisterFilter 函数,它产生以下输出 - 这是一个混淆的 C++ 函数名:

?RegisterFilter@@YGHPBGK@Z (int __stdcall RegisterFilter(unsigned short const *,unsigned long))

我尝试使用 Visual Studio 2008 和 clrdump.lib 创建了一个示例程序。下面是我的代码:

#include <windows.h>
#include "ClrDump.h"

int _tmain(int argc, _TCHAR* argv[])
{
    RegisterFilter(L"", 0);
    return 0;
}

编译代码时出现以下链接器错误:

LNK2019: unresolved external symbol "__declspec(dllimport) int __stdcall RegisterFilter(wchar_t const *,unsigned long)" (__imp_?RegisterFilter@@YGHPB_WK@Z)

使用Visual C++ 6.0可以成功构建代码。

请注意,dumpbin输出将RegisterFilter的第一个参数显示为unsigned short const *,但链接器错误中显示为wchar_t const *。在Visual C++ 6.0中,wchar_t通常是unsigned short的typedef,而在后续版本中它是不同的内置类型。

为了解决Visual Studio 2008中的问题,我将“将wchar_t视为内置类型”选项设置为“否”(在编译器命令行上指定/Zc:wchar_t-),现在代码可以成功构建。

对于我之前的答案造成的混淆,我很抱歉。我希望这个回答更加有用!


ChrisN: 这远远超出了这些帖子组的期望。我尝试在调用函数中使用强制转换(编译器无法解决该问题,已删除),我还尝试了编译器选项:/Zc:wchar_t-。在我自己的情况下,尽管首先进行了干净的构建,但仍然失败了! - JosephDoggie
1
没有看到你更多的代码,我觉得我无法提供更进一步的帮助。你有这个库的源代码吗? - ChrisN

5
我最近遇到了同样的问题。我排除了一个库以避免冲突,所有错误都消失了,但LINK错误(就像你描述的那样)没有消失。当我将库交换为另一个库(我排除(忽略)MSVCRT.lib,现在我排除(忽略)LIBCMT.lib)时,问题消失了。确保您没有在某个地方混淆库。
在我的情况下,链接器失败,并显示“找不到imp _aligned_malloc”。
当然,在我的代码中没有这种名称的方法。编译器正在为之添加imp。为什么我不知道,除非我按照上述说明交换了排除(忽略)。
尝试从新项目开始,重新添加源文件和头文件,并跟踪您排除(忽略)的库。尝试各种组合。希望能帮到您。

3

我在VS2005中创建一个简单的Win32 c++应用程序时,遇到了以下错误:

LNK2019: unresolved external symbol __imp__somefunction

该应用程序使用属性表,因此需要此头文件(prsht.h)。

解决我的问题的方法如下:在程序 属性→配置属性→链接器→常规 中,我将 附加库目录 设置为 "C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Lib"

同样,在程序 属性→配置属性→链接器→命令行 中,在 附加选项 中,我添加了 ComCtl32.Lib ComDlg32.Lib

现在我的程序已经可以编译而没有任何问题。我的建议是:您需要确定程序所需的所有库。提示:检查您包含的所有头文件,确保您的链接器可以看到它们。


1
我正在开发一个非常简单的ATL/COM应用程序,并尝试调用CreateMappedBitmap(...)方法。在使用VS 2012时,我收到了关于此方法调用的LNK2019错误。上述建议关于添加comctl32.lib对我有用。我没有进行任何其他更改。 - Jim Kennedy

3

尝试为您的链接器(通常是命令行开关)打开详细输出。这将显示链接器正在尝试解析符号的确切方式,以便您可以查看:

  • 符号的签名是否符合您的预期
  • 链接器是否在正确的位置查找您的库

希望这可以帮助您!


3

不知道是不是你的情况,但 imp 前缀可能意味着你正在 Win32 项目中编译 x64 库。


1

使用 .DEF 文件

如果您选择使用 __declspec(dllimport) 以及 .DEF 文件,您应该更改 .DEF 文件以使用 DATA 或 CONSTANT,以减少错误编码可能导致问题的可能性:

// project.def
LIBRARY project
EXPORTS
   ulDataInDll   CONSTANT

以下表格说明原因:
Keyword      Emits in the import library   Exports
CONSTANT     _imp_ulDataInDll              _ulDataInDll
             _ulDataInDll                  

DATA         _imp_ulDataInDll              _ulDataInDll

http://msdn.microsoft.com/en-us/library/aa271769(v=vs.60).aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接