Jos*_*gie 5 c++ makefile clrdump visual-studio
我正在使用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 );
Run Code Online (Sandbox Code Playgroud)
此外,在makeexe.mak中,库被链接为:
$(COMPILEBASE)\ lib\clrdump.lib \
说实话,我不是makefile的专家,而且我正在将系统从Microsoft Visual C++ 6.0转换到2008.这种转换可能与链接错误有关,就像以前系统工作一样.
真的很感激任何帮助.
提前致谢,
真诚的,约瑟夫
- 编辑1 -
有谁知道如何在pvcs的makefile系统中打开详细信息?
请注意,上面的函数已经是编译器装饰的版本了
__imp__RegisterFilter@8
Run Code Online (Sandbox Code Playgroud)
而C++的功能就是
RegisterFilter
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助,但如果有人可以发布更完整的解决方案,那也将非常感激.
真诚的,约瑟夫
- 编辑2 -
有些人发布了这个,但当我登录时它消失了:
imp前缀表示此函数是从DLL导入的.检查 - 的定义CLRDUMP_API- 是__declspec(dllimport)吗?有关更多信息,请参阅此文章.
有一个工作链接,但我已经失去了,但我想人们总是可以搜索主题.
谢谢,无论你是谁!
- 编辑3 -
谢谢ChrisN(我还没有被允许投票).尽管使用了刷新按钮,但你的答案消失了,但是在我发布了一个cut-n-paste之后又重新出现了.
这是我对此的定义:
define CLRDUMP_API __declspec(dllimport) __stdcall
Run Code Online (Sandbox Code Playgroud)
我假设__stdcall没问题?
- 编辑4 -
虽然我很感谢那些回答的人的努力,特别是ChrisN,至少在我的特定系统上,链接错误仍然存在.所以如果有人有任何进一步的见解,我会很感激.再次感谢.
Chr*_*isN 14
该__imp_前缀表示该连接器预计这一功能从DLL进口.
是否来自此页面的clrdump库?如果是这样,请注意extern "C"库中提供的头文件中未使用该文件.我使用以下命令确认了这一点:
dumpbin /exports clrdump.lib
Run Code Online (Sandbox Code Playgroud)
它产生以下输出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;
}
Run Code Online (Sandbox Code Playgroud)
构建它会产生以下链接器错误:
LNK2019: unresolved external symbol "__declspec(dllimport) int __stdcall RegisterFilter(wchar_t const *,unsigned long)" (__imp_?RegisterFilter@@YGHPB_WK@Z)
代码使用Visual C++ 6.0构建正常.
请注意,dumpbin输出显示第一个参数为RegisterFilteras,unsigned short const *但链接器错误显示wchar_t const *.在Visual C++ 6.0中,wchar_t通常是typedef unsigned short,而在以后的版本中,它是一种独特的内置类型.
若要解决Visual Studio 2008中的问题,我将"将wchar_t视为内置类型"选项设置为"否"(/Zc:wchar_t-在编译器命令行上指定),现在代码构建正常.
很抱歉与我之前的回答混淆了.我希望这更有帮助!
小智 5
我最近遇到了同样的问题.我排除了一个库来避免碰撞,所有的bug都消失了,除了LINK错误(就像你描述的那样).当我为另一个库交换库时(我排除(忽略)MSVCRT.lib,现在我排除(忽略)LIBCMT.lib)问题消失了.确保你没有在某处混合库.在我的情况下,链接器失败了"找不到imp _aligned_malloc".当然,我的任何代码中都没有该名称的方法.编译器在前面加上了imp.究竟为什么我不知道,除了当我交换排除(忽略)时问题消失了,如上所述.
尝试从一个新项目开始,重新添加源文件和头文件,并跟踪您排除的库(忽略).尝试各种组合.希望有所帮助.
小智 3
我在 VS2005 中创建一个简单的 Win32 c++ 应用程序,但收到此错误:
\n\nLNK2019: unresolved external symbol __imp__somefunction\nRun Code Online (Sandbox Code Playgroud)\n\n该应用程序使用属性表,因此需要此标头 (prsht.h)。
\n\n我的问题的解决方案如下:在程序Properties\xe2\x86\x92Configuration Properties\xe2\x86\x92Linker\xe2\x86\x92General中,我将附加库目录设置为"C:\\Program Files\\Microsoft Visual Studio 8\\VC\\PlatformSDK\\Lib"。
另外,在程序Properties\xe2\x86\x92Configuration Properties\xe2\x86\x92Linker\xe2\x86\x92Additional Options的命令行中,我添加了ComCtl32.Lib ComDlg32.Lib。
我的程序现在正在编译,没有任何问题。我的两点意见:您需要确定您的程序所需的所有库。提示:检查您包含的所有标头,您需要确保您的链接器可以看到它们。
\n