VS编程常见的编译和链接错误

常见错误1:

Error 2 error LNK1120: 1 unresolved externals

Error 1 error LNK2019: unresolved external symbol __imp__PathFileExistsA@4 referenced in function "public: void __thiscall myspace::RCSetupWithVirtual::StartupSetup(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?StartupSetup@RCSetupWithVirtual@myspace@@QAEXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)


首先我们注意,这是一个链接错误,链接过程中找不到东西了。出现这个错误其实就是这样的,找不到这个函数的定义,目前我遇到的情况有以下几种:

 1> 这个错误提示的函数一个系统的API,PathFileExists,对于系统的API都是在电脑上有的,无非是lib和dll加载。对于初学者,可能对lib文件,dll文件比较陌生。其实很简单,为什么我们写个头文件包含比如#include<iostream> 就可以使用里面的cout和cin函数了呢?其实就是因为我们的电脑有这些函数的实现代码,只不过它们的头文件我们可以看到,源文件被编译成lib文件(静态链接)或者dll(动态链接)。我们当然就看不到里面的内容了(都是二进制的)。解决这个问题的方法很简单,首先去MSDN上搜下你用到的这个API,比如就是PathFileExists这个,里面有使用这个API的详细信息:



需要包含的头文件,lib文件。我们需要做的就是把这个lib文件包含进去。工程属性---Linker---Input---Additional Dependencies 点击下拉按钮选择Edit,然后直接放进去就好。

  继续编译试下,就OK了.

 2> 如果这个函数是自己编写的或者是自己的工程中的某个函数,这时候就应该意识到,没有找到这个函数。如果是两个不同的工程,是不能直接#include进来的,当跨工程写代码的时候,这个问题会碰到。自己不知不觉调用了一个其他工程的函数,编译的时候没有错误,但是链接的时候就找不到了。解决的办法是在同一个工程里面写代码,如果非要跨工程,那就像调用系统函数一样,lib和dll两种方式了。

 3>还有一个情况,头文件包含了,也是同一个工程,但还是找不到,提示链接错误。这个时候还有种情况就是,你有没有添加相应文件到工程里。有时候我们不是从工程里创建文件,而是在外部复制了一个文件,直接打开,进行一下改写。我们在开发时,大部分都是参考别人之前的代码,复用嘛!所以这种方式很常用。但这就有个问题,你忘记把相应的文件添加到对应的工程了,就是这样:


如果没有导入进来,是会有链接错误的。

常见错误2:

Error 2 error LNK1120: 1 unresolved externals

Error 1 error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup

或者

Error 2 error LNK1120: 1 unresolved externals

Error 1 error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup

这是两种特别常见的错误对于初学者,就算是其他程序员,也有时候会写成这样。错误的意思就是:本来你建工程的时候创建的是控制台工程,结果主函数写成了WinMain;或者建的是win32工程,主函数写成了main。 有的人就是重新创建一次工程,这当然是不好的。VS的任何设置都是可以改的,要试着去了解这些东西。修改的地方是:工程属性---Linker---System---SubSystem。这里注意一个地方,最好的做法是选择Not Set。为什么呢?这是《Windows核心编程》里说明,这样设置后系统会自动匹配主函数,你写成什么工程都可以,这才是完美的办法啊!

常见错误3:

Error 1 error C2664: 'BOOL PathFileExistsW(LPCWSTR)' : cannot convert argument 1 from 'const char *' to 'LPCWSTR‘

原因是我使用了一个这条语句,PathFileExists(fileName.c_str())

PathFileExists的参数类型是LPCTSTR,而fileName是string类型,这就跑到之前的话题string如何转换成LPCTSTR类型。其实只要使用.c_str()类型就可以,这个函数并不是只对char*有效,它会进行判断,如果是wchar_t*也会相应的转换。出现这个错误是Character Set的设置问题,很简单,出现这种错误,直接将工程属性---General---Character Set设置为Not Set即可。统一使用通配类型,符合兼容性即可。

常见错误3:

pointer to incomplete class type is not allowed 

这个错误在我这里是因为缺少必须的头文件。这个其实也很容易犯错。当工程很大的时候,需要加很多头文件,漏掉几个很正常,因此赶紧记下来。

常见错误4:

Error 1 error LNK1181: cannot open input file 'base_MT

这种错误是非常常见的,我们要使用其他的lib库,包含进来却发现链接错误。这种错误其他也很简单。就是IDE占不到这个lib文件导致的。我们要添加一个lib文件。要在'工程属性里面的Linker/Librarian中找到Additional Library Directories加入正确的lib路径。并且找到Additional Dependencies,在里面把lib名称写进去。这样才能正确找到。不过我的这个错误是在正确配置了上面两项之后依然提示的,最终我发现,是我少加了lib扩展名。一般电脑的默认设置都是不显示扩展名和隐藏重要文件的,这对开发可不方便。我就是在复制lib名称的时候没有复制lib后缀,导致出错。现在只需把Additional Dependencies里面的base_MT改为base_MT.lib即可通过编译。

********************************************************************************************

自己遇到的错误1:

Error 1 error C2664: 'INT_PTR DialogBoxParamA(HINSTANCE,LPCSTR,HWND,DLGPROC,LPARAM)' : cannot convert argument 4 from 'bool (__stdcall *)(HWND,UINT,WPARAM,LPARAM)' to 'DLGPROC'e:\virtualdesktop\virtualdesktop\virtualdesktop.cpp171VirtualDesktop

2 IntelliSense: argument of type "bool (__stdcall *)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)" is incompatible with parameter of type "DLGPROC"e:\VirtualDesktop\VirtualDesktop\VirtualDesktop.cpp175VirtualDesktop

怎么会出现这种错误呢?我就写了个简单的程序,如下:

bool WINAPI Dlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    return false;
}

int APIENTRY WinMain(HINSTANCE hInstexe, HINSTANCE, PSTR nCmdLine, int nCmdShow)
{
    DialogBox(hInstexe, MAKEINTRESOURCE(IDD_DIALOG1), NULL, Dlg_Proc);
    return 0;
}


只是启动一个对话框,但是就是提示Dlg_Proc这个函数有问题,后来我对比一个正确的代码发现,原来是函数的返回值bool。正确的返回值是BOOL,这两个不同吗?当然是不同的。

typedef int                 BOOL;


看到了吧?类型是错误的,难怪会出错呢!基础不扎实,而且也不细心。

自己遇到的错误2:

error C2385: ambiguous access of 'DuiDdxControl'

字面上是模糊不清的定义,应该是这个DuiDdxControl这块定义的有歧义,但是如何下手呢?想了想,自己最近改动的地方就是添加了父类。于是进入父类看了下,原来父类中继承了一个模板类,而我的类也继承了这个,继承了两个一样的类,导致出现了歧义

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值