zoukankan      html  css  js  c++  java
  • VS编程常见的编译和链接错误

    转载:https://www.cnblogs.com/clnchanpin/p/6739273.html

    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文件比較陌生。事实上非常easy,为什么我们写个头文件包括比方#include<iostream> 就能够使用里面的cout和cin函数了呢?事实上就是由于我们的电脑有这些函数的实现代码,仅仅只是它们的头文件我们能够看到,源文件被编译成lib文件(静态链接)或者dll(动态链接)。我们当然就看不到里面的内容了(都是二进制的)。

    解决问题的方法非常easy。首先去MSDN上搜下你用到的这个API。比方就是PathFileExists这个,里面有使用这个API的具体信息:

    须要包括的头文件。lib文件。我们须要做的就是把这个lib文件包括进去。

    project属性---Linker---Input---Additional Dependencies 点击下拉button选择Edit。然后直接放进去就好。

      继续编译试下,就OK了.

     2> 假设这个函数是自己编写的或者是自己的project中的某个函数,这时候就应该意识到,没有找到这个函数。假设是两个不同的project,是不能直接#include进来的,当跨project写代码的时候,这个问题会碰到。

    自己不知不觉调用了一个其它project的函数。编译的时候没有错误。可是链接的时候就找不到了。解决的办法是在同一个project里面写代码。假设非要跨project,那就像调用系统函数一样,lib和dll两种方式了。

     3>另一个情况,头文件包括了。也是同一个project,但还是找不到,提示链接错误。这个时候还有种情况就是,你有没有加入对应文件到project里。有时候我们不是从project里创建文件,而是在外部复制了一个文件,直接打开。进行一下改写。我们在开发时。大部分都是參考别人之前的代码,复用嘛!所以这样的方式非经常常使用。

    但这就有个问题。你忘记把对应的文件加入到对应的project了,就是这样:

    假设没有导入进来。是会有链接错误的。

    常见错误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

    这是两种特别常见的错误对于刚開始学习的人。就算是其它程序猿,也有时候会写成这样。

    错误的意思就是:本来你建project的时候创建的是控制台project,结果主函数写成了WinMain;或者建的是win32project,主函数写成了main。

    有的人就是又一次创建一次project,这当然是不好的。VS的不论什么设置都是能够改的,要试着去了解这些东西。改动的地方是:project属性---Linker---System---SubSystem。这里注意一个地方,最好的做法是选择Not Set。为什么呢?这是《Windows核心编程》里说明,这样设置后系统会自己主动匹配主函数。你写成什么project都能够,这才是完美的办法啊!

    常见错误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的设置问题,非常easy,出现这样的错误,直接将project属性---General---Character Set设置为Not Set就可以。

    统一使用通配类型,符合兼容性就可以。

    常见错误3:

    pointer to incomplete class type is not allowed 

    这个错误在我这里是由于缺少必须的头文件。

    这个事实上也非常easy犯错。当project非常大的时候,须要加非常多头文件,漏掉几个非常正常,因此赶紧记下来。

    常见错误4:

    Error 1  error LNK1181: cannot open input file 'base_MT

    这样的错误是非经常见的。我们要使用其它的lib库,包括进来却发现链接错误。这样的错误其它也非常easy。

    就是IDE占不到这个lib文件导致的。

    我们要加入一个lib文件。要在'project属性里面的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:virtualdesktopvirtualdesktopvirtualdesktop.cpp171VirtualDesktop

    2 IntelliSense: argument of type "bool (__stdcall *)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)" is incompatible with parameter of type "DLGPROC"e:VirtualDesktopVirtualDesktopVirtualDesktop.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这块定义的有歧义,可是怎样下手呢?想了想,自己近期修改的地方就是加入了父类。

    于是进入父类看了下,原来父类中继承了一个模板类。而我的类也继承了这个。继承了两个一样的类。导致出现了歧义

     
     
  • 相关阅读:
    670. Maximum Swap
    653. Two Sum IV
    639. Decode Ways II
    636. Exclusive Time of Functions
    621. Task Scheduler
    572. Subtree of Another Tree
    554. Brick Wall
    543. Diameter of Binary Tree
    535. Encode and Decode TinyURL
    博客园自定义背景图片
  • 原文地址:https://www.cnblogs.com/MCSFX/p/13434577.html
Copyright © 2011-2022 走看看