我正在使用makefile系统与pvcs编译器(使用Microsoft Visual C++,2008编译器),我收到的形式有几个链接错误:
error LNK2019: unresolved external symbol __imp__RegisterFilter@8 referenced in function _main
这是发生在DESPITE使用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.这种转换可能与链接错误有关,就像以前系统工作一样.
真的很感激任何帮助.
提前致谢,
真诚的,约瑟夫
- 编辑1 -
有谁知道如何在pvcs的makefile系统中打开详细信息?
请注意,上面的函数已经是编译器装饰的版本了
__imp__RegisterFilter@8
而C++的功能就是
RegisterFilter
感谢您的帮助,但如果有人可以发布更完整的解决方案,那也将非常感激.
真诚的,约瑟夫
- 编辑2 -
有些人发布了这个,但当我登录时它消失了:
imp前缀表示此函数是从DLL导入的.检查 - 的定义CLRDUMP_API
- 是__declspec(dllimport)
吗?有关更多信息,请参阅此文章.
有一个工作链接,但我已经失去了,但我想人们总是可以搜索主题.
谢谢,无论你是谁!
- 编辑3 -
谢谢ChrisN(我还没有被允许投票).尽管使用了刷新按钮,但你的答案消失了,但是在我发布了一个cut-n-paste之后又重新出现了.
这是我对此的定义:
define CLRDUMP_API __declspec(dllimport) __stdcall
我假设__stdcall没问题?
- 编辑4 -
虽然我很感谢那些回答的人的努力,特别是ChrisN,至少在我的特定系统上,链接错误仍然存在.所以如果有人有任何进一步的见解,我会很感激.再次感谢.
该__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#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
as,unsigned short const *
但链接器错误显示wchar_t const *
.在Visual C++ 6.0中,wchar_t
通常是typedef unsigned short
,而在以后的版本中,它是一种独特的内置类型.
若要解决Visual Studio 2008中的问题,我将"将wchar_t视为内置类型"选项设置为"否"(/Zc:wchar_t-
在编译器命令行上指定),现在代码构建正常.
很抱歉与我之前的回答混淆了.我希望这更有帮助!
我最近遇到了同样的问题.我排除了一个库来避免碰撞,所有的bug都消失了,除了LINK错误(就像你描述的那样).当我为另一个库交换库时(我排除(忽略)MSVCRT.lib,现在我排除(忽略)LIBCMT.lib)问题消失了.确保你没有在某处混合库.在我的情况下,链接器失败了"找不到imp _aligned_malloc".当然,我的任何代码中都没有该名称的方法.编译器在前面加上了imp.究竟为什么我不知道,除了当我交换排除(忽略)时问题消失了,如上所述.
尝试从一个新项目开始,重新添加源文件和头文件,并跟踪您排除的库(忽略).尝试各种组合.希望有所帮助.