沒法解析的外部符號 "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAX

採用下面的方法。從新編譯了一下依賴的庫,OK了。工具

  問題描述:ui

      今天用VS2010編譯一個在VS2008下Coding的工程的時候,VS給出了一堆連接錯誤信息,以下圖所示:google

       

      在ErrorList裏面列出了34個連接錯誤信息,但仔細看的話,其實不少都是重複的,只有兩三個外部符號未正確解析,以下:spa

      "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)blog

       

       問題分析: ci

       首先,能夠肯定是程序在Build(構建)過程當中,連接靜態連接庫libprotobuf.lib的時候出現外部符號沒法解析的問題,並且能夠看出 libprotobuf.lib庫中的不少的中間目標文件(Windows下以.obj做後綴名的文件)都對此外部符號存在着引用,但在符號重定位時候卻 在全局符號表中找不到引用的符號。        get

       而_Xran和_Xlen這兩個符號究竟是什麼呢,經過google能夠大體瞭解到時string類裏面的兩個符號,難道問題出在對於string類的引 用麼?那麼咱們能夠經過下術的步驟來觀察一個引用string頭文件的源文件通過IDE的預處理後是怎麼樣的   編譯器

      一、新建一個名爲Test.CPP文件,內容很簡單,只是包含一個string頭文件,即#include<string> string

    二、打開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

相關文章
相關標籤/搜索