• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            C++ Programmer's Cookbook

            {C++ 基礎(chǔ)} {C++ 高級} {C#界面,C++核心算法} {設(shè)計模式} {C#基礎(chǔ)}

            vc編譯鏈接錯誤--LNK2001,LNK2019,

            --??LINK2001
            學(xué)習(xí)VC++時經(jīng)常會遇到鏈接錯誤LNK2001,該錯誤非常討厭,因為對于
            編程者來說,最好改的錯誤莫過于編譯錯誤,而一般說來發(fā)生連接錯誤時,
            編譯都已通過。產(chǎn)生連接錯誤的原因非常多,尤其LNK2001錯誤,常常使人不
            明其所以然。如果不深入地學(xué)習(xí)和理解VC++,要想改正連接錯誤LNK2001非
            常困難。
              初學(xué)者在學(xué)習(xí)VC++的過程中,遇到的LNK2001錯誤的錯誤消息主要為:
              unresolved external symbol “symbol”(不確定的外部“符號”)。
              如果連接程序不能在所有的庫和目標(biāo)文件內(nèi)找到所引用的函數(shù)、變量或
            標(biāo)簽,將產(chǎn)生此錯誤消息。一般來說,發(fā)生錯誤的原因有兩個:一是所引用
            的函數(shù)、變量不存在、拼寫不正確或者使用錯誤;其次可能使用了不同版本
            的連接庫。
              以下是可能產(chǎn)生LNK2001錯誤的原因:
              一.由于編碼錯誤導(dǎo)致的LNK2001。
              1.不相匹配的程序代碼或模塊定義(.DEF)文件能導(dǎo)致LNK2001。例如,
            如果在C++ 源文件內(nèi)聲明了一變量“var1”,卻試圖在另一文件內(nèi)以變量
            “VAR1”訪問該變量,將發(fā)生該錯誤。
              2.如果使用的內(nèi)聯(lián)函數(shù)是在.CPP文件內(nèi)定義的,而不是在頭文件內(nèi)定
            義將導(dǎo)致LNK2001錯誤。
              3.調(diào)用函數(shù)時如果所用的參數(shù)類型同函數(shù)聲明時的類型不符將會產(chǎn)生
            LNK2001。
              4.試圖從基類的構(gòu)造函數(shù)或析構(gòu)函數(shù)中調(diào)用虛擬函數(shù)時將會導(dǎo)致LNK2001。
              5.要注意函數(shù)和變量的可公用性,只有全局變量、函數(shù)是可公用的。
              靜態(tài)函數(shù)和靜態(tài)變量具有相同的使用范圍限制。當(dāng)試圖從文件外部訪問
            任何沒有在該文件內(nèi)聲明的靜態(tài)變量時將導(dǎo)致編譯錯誤或LNK2001。
              函數(shù)內(nèi)聲明的變量(局部變量) 只能在該函數(shù)的范圍內(nèi)使用。
              C++ 的全局常量只有靜態(tài)連接性能。這不同于C,如果試圖在C++的
            多個文件內(nèi)使用全局變量也會產(chǎn)生LNK2001錯誤。一種解決的方法是需要時在
            頭文件中加入該常量的初始化代碼,并在.CPP文件中包含該頭文件;另一種
            方法是使用時給該變量賦以常數(shù)。
              二.由于編譯和鏈接的設(shè)置而造成的LNK2001
              1.如果編譯時使用的是/NOD(/NODEFAULTLIB)選項,程序所需要的運行
            庫和MFC庫在連接時由編譯器寫入目標(biāo)文件模塊, 但除非在文件中明確包含
            這些庫名,否則這些庫不會被鏈接進(jìn)工程文件。在這種情況下使用/NOD將導(dǎo)
            致錯誤LNK2001。
              2.如果沒有為wWinMainCRTStartup設(shè)定程序入口,在使用Unicode和MFC
            時將得到“unresolved external on _WinMain@16”的LNK2001錯誤信息。
              3.使用/MD選項編譯時,既然所有的運行庫都被保留在動態(tài)鏈接庫之內(nèi),
            源文件中對“func”的引用,在目標(biāo)文件里即對“__imp__func” 的引用。
            如果試圖使用靜態(tài)庫LIBC.LIB或LIBCMT.LIB進(jìn)行連接,將在__imp__func上發(fā)
            生LNK2001;如果不使用/MD選項編譯,在使用MSVCxx.LIB連接時也會發(fā)生LNK2001。
              4.使用/ML選項編譯時,如用LIBCMT.LIB鏈接會在_errno上發(fā)生LNK2001。
              5.當(dāng)編譯調(diào)試版的應(yīng)用程序時,如果采用發(fā)行版模態(tài)庫進(jìn)行連接也會產(chǎn)
            生LNK2001;同樣,使用調(diào)試版模態(tài)庫連接發(fā)行版應(yīng)用程序時也會產(chǎn)生相同的
            問題。
              6.不同版本的庫和編譯器的混合使用也能產(chǎn)生問題,因為新版的庫里可
            能包含早先的版本沒有的符號和說明。
              7.在不同的模塊使用內(nèi)聯(lián)和非內(nèi)聯(lián)的編譯選項能夠?qū)е翷NK2001。如果
            創(chuàng)建C++庫時打開了函數(shù)內(nèi)聯(lián)(/Ob1或/Ob2),但是在描述該函數(shù)的相應(yīng)頭
            文件里卻關(guān)閉了函數(shù)內(nèi)聯(lián)(沒有inline關(guān)鍵字),這時將得到該錯誤信息。
            為避免該問題的發(fā)生,應(yīng)該在相應(yīng)的頭文件中用inline關(guān)鍵字標(biāo)志內(nèi)聯(lián)函數(shù)。
              8.不正確的/SUBSYSTEM或/ENTRY設(shè)置也能導(dǎo)致LNK2001。
              其實,產(chǎn)生LNK2001的原因還有很多,以上的原因只是一部分而已,對初
            學(xué)者來說這些就夠理解一陣子了。但是,分析錯誤原因的目的是為了避免錯
            誤的發(fā)生。LNK2001錯誤雖然比較困難,但是只要注意到了上述問題,還是能
            夠避免和予以解決的。

            LNK2019
            函數(shù)只有申明,沒有實現(xiàn)時,或是DLL中的東東沒有export啊

            unresolved external symbol 'symbol' referenced in function 'function'

            An undefined external symbol (symbol) was found in function. To resolve this error, provide a definition for symbol or remove the code that references it.

            In Visual C++ .NET 2003, this error will be generated when /clris used and the CRT is not linked into your executable. Any object code generated by the compiler that is not built with /clr:initialAppDomain contains a reference to the _check_commonlanguageruntime_version function, which is defined in the C Runtime Library (CRT). This function provides for an error message if your application is run on version 1 of the runtime. Code generated by the current compiler is not compatible with version 1 of the common language runtime. So, if you compile without the CRT in Visual C++ .NET 2003, you should include a definition of the _check_commonlanguageruntime_version function in your code. As an alternative to using the _check_commonlanguageruntime_version function, you can link with nochkclr.obj, which contains an empty version of the function and does not provide for an error message if you run your application on version 1 of the runtime. To build an application with the current compiler version to run on the previous version of the runtime, use /clr:InitialAppDomain.

            To build a pure MSIL executable (does not link with the CRT), you must define the function in your project; you cannot use nochkclr.obj (the .obj is native code). See Producing Verifiable Components with Managed Extensions for C++for more information about verifiable code. For more information on creating a pure MSIL output file from your Managed C++ project, see Converting Managed Extensions for C++ Projects from Mixed-Mode to Pure IL.

            The rest of this topic discusses other causes of LNK2019.

            Consider the following sample:

            extern int i;
            extern void g();
            void f()
            {
               i++;
               g();
            }
            int main()
            {
            }

            If i and g are not defined in one of the files included in the build, the linker will generate LNK2019. These definitions can be added by including the source code file that contains the definitions as part of the compilation. Alternatively, you can pass .obj or .lib files that contain the definitions to the linker.

            For C++ projects from previous releases that were upgraded to the current version, if __UNICODE was defined and the entry point was WinMain, you need to change the name of the entry point function to either _tWinMain or _tmain.

            Common problems that cause LNK2019 include:

            • The declaration of the symbol contains a spelling mistake, such that, it is not the same name as the definition of the symbol.
            • A function was used but the type or number of the parameters did not match the function definition.
            • The calling convention (__cdecl, __stdcall, or __fastcall) differs on the use of the function declaration and the function definition.
            • Symbol definitions are in a file that was compiled as a C program and symbols are declared in a C++ file without an extern "C" modifier. In that case, modify the declaration, for example, instead of:
              extern int i;
              extern void g();

              use:

              extern "C" int i;
              extern "C" void g();

              Similarly, if you define a symbol in a C++ file that will be used by a C program, use extern "C" in the definition.

            • A symbol is defined as static and then later referenced outside the file.
            • A static member of a class is not defined. For example, member variable si in the class declaration below should be defined separately:
              #include <stdio.h>
              struct X {
                 static int si;
              };
              
              // int X::si = 0;   // uncomment this line to resolve
              
              void main()
              {
                 X *px = new X[2];
                 printf("\n%d",px[0].si);   // LNK2019
              }

            This error can also be generated as a result of conformance work that was done for Visual Studio .NET 2003: template friends and specialization. In Visual Studio?.NET 2003, a friend declaration that declares a new non-template function must be defined.

            For code that is valid in both the Visual Studio?.NET 2003 and Visual Studio?.NET versions of Visual C++, explicitly specify the friend function's template argument list.

            // LNK2019.cpp
            // LNK2019 expected
            template<class T>
            void f(T)
            {
            }
            
            template<class T>
            struct S
            {
               friend void f(T);
               // Try the folowing line instead:
               // friend void f<T>(T);
            };
            
            int main()
            {
               S<int> s;
               f(1);   // unresolved external
            }

            The /VERBOSE linker option will help you see which files the linker is referencing. The /EXPORT and /SYMBOLS options of the DUMPBIN utility can also help you see which symbols are defined in your dll and object/library files.

            posted on 2006-08-17 10:08 夢在天涯 閱讀(4240) 評論(0)  編輯 收藏 引用 所屬分類: CPlusPlus

            公告

            EMail:itech001#126.com

            導(dǎo)航

            統(tǒng)計

            • 隨筆 - 461
            • 文章 - 4
            • 評論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1807518
            • 排名 - 5

            最新評論

            閱讀排行榜

            91精品国产色综久久| 久久久久久久久久久免费精品| 亚洲国产成人精品久久久国产成人一区二区三区综| 99久久国语露脸精品国产| 蜜臀久久99精品久久久久久 | 2021久久精品国产99国产精品| 久久久久久人妻无码| 亚洲国产精品成人久久蜜臀| 波多野结衣中文字幕久久| 亚洲伊人久久综合中文成人网| 7777久久久国产精品消防器材| 久久国产香蕉一区精品| 久久久久国产精品人妻| 久久国产精品一区| 亚洲AV无码1区2区久久| 亚洲精品乱码久久久久久久久久久久| 蜜臀久久99精品久久久久久小说 | 伊人 久久 精品| 777米奇久久最新地址| 综合久久一区二区三区| 国产 亚洲 欧美 另类 久久| 久久99国产精一区二区三区| 大伊人青草狠狠久久| 久久精品国产日本波多野结衣| 免费国产99久久久香蕉| 国产高潮久久免费观看| 久久棈精品久久久久久噜噜| 亚洲国产高清精品线久久| 99久久婷婷国产综合精品草原| 午夜久久久久久禁播电影| 中文字幕精品久久| 四虎国产精品成人免费久久| 精品国产婷婷久久久| 亚洲国产香蕉人人爽成AV片久久| 久久久91精品国产一区二区三区| 少妇高潮惨叫久久久久久| 久久久久亚洲AV片无码下载蜜桃| 日韩欧美亚洲综合久久影院Ds | 久久精品免费一区二区| 久久人人爽人人爽人人片AV高清 | 合区精品久久久中文字幕一区|