Visual Studio開啟低版本工程遇到連結錯誤的小結

來源:互聯網
上載者:User

      問題描述:

      今天用VS2010編譯一個在VS2008下Coding的工程的時候,VS給出了一堆連結錯誤資訊,如所示:

       

      在ErrorList裡面列出了34個連結錯誤資訊,但仔細看的話,其實很多都是重複的,只有兩三個外部符號未正確解析,如下:

      "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ)

      "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xran@_String_base@std@@SAXXZ)

       

       問題分析: 

       首先,可以確定是程式在Build(構建)過程中,連結靜態連結庫libprotobuf.lib的時候出現外部符號無法解析的問題,而且可以看出libprotobuf.lib庫中的很多的中間目標檔案(Windows下以.obj作尾碼名的檔案)都對此外部符號存在著引用,但在符號重定位時候卻在全域符號表中找不到引用的符號。        

       而_Xran和_Xlen這兩個符號到底是什麼呢,通過google可以大致瞭解到時string類裡面的兩個符號,難道問題出在對於string類的引用嗎?那麼我們可以通過下術的步驟來觀察一個引用string標頭檔的源檔案經過IDE的預先處理後是怎麼樣的   

      1、建立一個名為Test.CPP檔案,內容很簡單,只是包含一個string標頭檔,即#include<string> 

    2、開啟VS帶的Command Prompt,輸入命令 CL /EP Test.cpp > D:\\1.txt

      上述命令為使用MSVC的編譯器對Test.cpp進行預先處理操作,並將內容重新導向到1.txt中。    

      情況一:

      如果你用的VS2005或者VS2008下的命令列工具的話,在開啟1.txt後其實可以搜尋到如下的內容:

      

      

      情況2:

      如果你使用的是VS2010的話,那麼在產生的1.txt中搜尋_Xlen與_Xran的話,則為如下的內容:

       

       補充:其中第二個_Xran與_Xlen是在類basic_string中定義的,顯然與VS2005與VS2008下產生的不同。

      

       問題總結:

       靜態連結庫libprotobuf.lib在舊版本IDE上編譯的,所以string類中符號被解析成形如static void __cdecl _Xlen() 

       而在高版本的VS2010上string中的_Xlen與_Xran符號則被解析成了__declspec(noreturn) void _Xlen() const

       所以才會在連結過程中出現上述開頭出現的一堆問題

  

       問題解決: 

       第一種方法:

      重新在高版本的IDE下編譯libprotobuf.lib,這種方法最行之有效啦,也很簡單

       第二種方法:

             可以建立一個連結庫,匯出無法解析的幾個符號,並這幾個符號實現中重新導向到VS2010下預先處理後的那幾個符號即可。具體參考這個網址:http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/5ac28a31-3339-4db1-90f4-68edad360309 裡面的JN123給出的方法 

 

        歡迎裝載,裝載請註明出處:http://www.cnblogs.com/royenhome 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.