5

我正在使用带有 pvcs 编译器的 makefile 系统(使用 Microsoft Visual C++,2008 编译器)并且我收到了以下形式的几个链接错误:

error LNK2019: unresolved external symbol __imp__RegisterFilter@8 referenced in function _main

尽管使用extern "C"声明,即发生这种情况,即:

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

此外,在 makeexe.mak 中,该库被链接为:

$(编译库)\lib\clrdump.lib\

老实说,我不是 makefile 方面的专家,我正在将系统从 Microsoft Visual C++ 6.0 转换到 2008。这种转换可能与链接错误有关,因为系统以前可以正常工作。

任何帮助将不胜感激。

提前致谢,

真诚的,约瑟夫

-- 编辑 1 --

有谁知道如何在 pvcs 的 makefile 系统中打开详细信息?

请注意,上面的函数已经是编译器修饰的版本,具有

__imp__RegisterFilter@8

而 C++ 函数只是

RegisterFilter

感谢您的帮助,但如果有人可以发布更完整的解决方案,那也将不胜感激。

真诚的,约瑟夫

-- 编辑 2 --

某个好心人发布了这个,但是当我登录时它消失了:

imp 前缀表示该函数是从 DLL 导入的。检查CLRDUMP_API- 的定义是__declspec(dllimport)吗?有关更多信息,请参阅本文。

有一个工作链接,但我失去了它,但我想人们总是可以搜索这个主题。

谢谢,不管你是谁!

-- 编辑 3 --

谢谢 ChrisN(我还不能投票)。尽管使用了刷新按钮,但您的答案消失了,但在我发布剪切粘贴后又重新出现。

这是我的定义:

define CLRDUMP_API __declspec(dllimport) __stdcall

我假设 __stdcall 没问题?

-- 编辑 4 --

虽然我感谢那些回答的人,尤其是 ChrisN,至少在我的特定系统上所做的努力,但链接错误仍然存​​在。因此,如果有人有任何进一步的见解,我将不胜感激。再次感谢。

4

6 回答 6

14

__imp_前缀表示链接器希望从 DLL 导入此函数。

这个页面的 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输出显示第一个参数RegisterFilterasunsigned short const *但链接器错误显示wchar_t const *。在 Visual C++ 6.0 中,wchar_t通常是 的 typedef unsigned short,而在更高版本中,它是不同的内置类型。

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

很抱歉与我之前的回答混淆。我希望这更有帮助!

于 2008-12-02T21:16:07.077 回答
5

我最近遇到了同样的问题。我排除了一个库以避免冲突,所有的错误都消失了,除了 LINK 错误(正如你所描述的)。当我将库换成另一个库时(我排除(忽略)MSVCRT.lib,现在我排除(忽略)LIBCMT.lib)问题消失了。确保您没有在某处混淆库。就我而言,链接器因“找不到imp _aligned_malloc”而失败。当然,我的任何代码中都没有该名称的方法。编译器在imp前面。究竟为什么我不知道,除了当我如上所述交换排除(忽略)时问题消失了。

尝试从一个新项目开始,重新添加您的源文件和头文件,并跟踪您排除(忽略)的库。尝试各种组合。希望有帮助。

于 2011-09-30T19:50:25.863 回答
3

尝试打开链接器的详细输出(通常是命令行开关)。这将向您准确显示链接器如何尝试解析符号,因此您可以查看是否:

  • 符号的签名是您所期望的
  • 链接器正在为您的库寻找正确的位置

我希望这有帮助!

于 2008-12-02T18:11:58.337 回答
3

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

LNK2019: unresolved external symbol __imp__somefunction

此应用程序正在使用属性表,因此它需要此标头 (prsht.h)。

我的问题的解决方案如下:在程序Properties→Configuration Properties→Linker→General中,我将Additional Library Directories设置为"C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Lib".

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

我的程序现在正在编译,没有任何问题。我的两分钱:您需要确定程序所需的所有库。提示:检查您包含的所有标题,您需要确保您的链接器可以看到它们。

于 2010-03-31T10:54:34.130 回答
3

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

于 2011-05-05T08:31:08.987 回答
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

于 2011-08-05T21:26:39.277 回答