• <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>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運轉,開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            一、案例

            ???? 編譯出一個動態庫.libXXXEngine.so。然后直接在另一個工程中,把頭文件include進來,并link到該庫:-lXXXEngine.

            嘗試編譯,出錯:

            .//libXXXEngine.so:undefined reference to`CHttpParser::GetCurrentHttpMethod(http_method_t&)'

            ?

            .//libGenaEngine.so: undefined reference to `CHttpParser::CHttpParser(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
            .//libGenaEngine.so: undefined reference to `CHttpParser::ExactResultFromHttpMsgBody(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
            .//libGenaEngine.so: undefined reference to `CHttpParser::parse(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
            collect2: ld returned 1 exit status


            從描述上看,以下四個函數沒有定義:

            ?

            (1) CHttpParser::GetCurrentHttpMethod(http_method_t&)

            (2)CHttpParser::CHttpParser(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)

            (3)CHttpParser::ExactResultFromHttpMsgBody(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'

            (4)CHttpParser::parse(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)

            ?

            然而奇怪的是,當我跟進libXXXengine.so的具體代碼時,卻發現頭文件和源文件的定義和聲明都可以找到。 那么究竟什么原因呢?


            二 問題分析

            ??? 出現這種錯誤,有幾個原因:

            (1)一是使用者自己定義的函數或者全局變量所在源代碼文件,沒有被編譯、連接。

            (2)一是使用者自己定義的函數或者全局變量沒有定義。

            (3) 未定義的符號是一個動態庫函數,在源程序中使用了該庫函數,而連接過程中還沒有給定相應的函數庫的名稱,或者是該檔案庫的目錄名稱有問題.

            即:.so文件沒有把所有需要的庫都鏈接上。使用了庫中定義的實體,但沒有指定庫(-lXXX)或者沒有指定庫路徑(-LYYY),會導致該錯誤,

            (4)C/C++相互依賴和鏈接
            gcc和g++編譯結果的混用需要保證能夠extern "C" 兩邊都可以使用的接口,在我們的64位環境中gcc鏈接g++的庫還需要加上 -lstdc++。

            ???? 經排查,我們在makefile中通過-lXXEngine正確鏈接了libXXXEngine.so,同時,我們也把相應的頭文件放到我當前工程目錄下了。然而,被告知且出錯的函數都是在動態庫中的。好奇怪!

            ??? 為了進一步找到問題的root cause,我們使用了nm命令來進一步排查:

            nm libXXXEngine.so |grep? C HttpParser

            ?

            ????????????? U _ZN11CHttpParser20GetCurrentHttpMethodER13http_method_t
            ???????????????? U _ZN11CHttpParser26ExactResultFromHttpMsgBodyESsRSs
            ???????????????? U _ZN11CHttpParser5parseESs
            ???????????????? U _ZN11CHttpParserC1ESs

            00000000000134e6 W _ZN5boost10shared_ptrI11CHttpParserE4swapERS2_
            0000000000012e56 W _ZN5boost10shared_ptrI11CHttpParserEC1ERKS2_
            0000000000012e30 W _ZN5boost10shared_ptrI11CHttpParserEC1Ev
            0000000000014cda W _ZN5boost10shared_ptrI11CHttpParserEC1IS1_EEPT_
            0000000000012cda W _ZN5boost10shared_ptrI11CHttpParserED1Ev
            0000000000013df4 W _ZN5boost10shared_ptrI11CHttpParserEaSERKS2_
            000000000001348b W _ZN5boost14checked_deleteI11CHttpParserEEvPT_
            0000000000014c4c W _ZN5boost6detail12shared_countC1I11CHttpParserEEPT_
            0000000000013bae W _ZN5boost6detail17sp_counted_impl_pI11CHttpParserE11get_deleterERKSt9type_info
            0000000000013b92 W _ZN5boost6detail17sp_counted_impl_pI11CHttpParserE7disposeEv
            0000000000013452 W _ZN5boost6detail17sp_counted_impl_pI11CHttpParserEC1EPS2_
            0000000000014d1e W _ZN5boost6detail17sp_counted_impl_pI11CHttpParserED0Ev
            0000000000014d5a W _ZN5boost6detail17sp_counted_impl_pI11CHttpParserED1Ev
            000000000001591c W _ZNK5boost10shared_ptrI11CHttpParserEptEv
            00000000000134b4 W _ZSt4swapIP11CHttpParserEvRT_S3_
            000000000021ba40 V _ZTIN5boost6detail17sp_counted_impl_pI11CHttpParserEE
            0000000000017420 V _ZTSN5boost6detail17sp_counted_impl_pI11CHttpParserEE
            000000000021ba00 V _ZTVN5boost6detail17sp_counted_impl_pI11CHttpParserEE
            0000000000017100 r _ZZNK5boost10shared_ptrI11CHttpParserEptEvE19__PRETTY_FUNCTION__

            ?

            ?

            命令輸出結果顯示,那些報錯的函數的符號 同樣可以在nm里找到。

            不同的是,這四個出錯的函數,輸出的前半部分為空。

            這就是異常和問題所在!

            ?

            下面我們只要對nm命令稍作了解:

            nm命令還是比較簡單而且強大的。它用來列出一個目標文件中的各種符號。符號的種類很多,以下是一些常見的符號類型

            nm輸出字符 含義
            R Read only symbol. 比如在代碼中有一個const MAXDATA = 3095; 則MAXDATA就是一個Read only symbol
            N 這是一個調試符號
            D 這是一個已經初始化的變量的符號。比如代碼中int i = 1和char *str = "Hello"則i和str都是這種類型的符號
            T Text段的符號。子程序都是這種符號,比如文件中實現了一個函數function,則function就是這種符號
            U 未定義的符號。如果文件中引用了不存在的函數,則這些未定義的函數符號就是這種類型
            S 未初始化的符號,比如全局變量int s;則s的符號就是此類型
            nm命令的詳細用法以及例子見正文。

            ?

            至此,我們可以推斷:動態庫中有未定義的符號,說明該動態庫的編譯有問題,即是如下原因之一:

            (1)一是使用者自己定義的函數或者全局變量所在源代碼文件,沒有被編譯、連接。

            (2)一是使用者自己定義的函數或者全局變量沒有定義。

            這種問題的解決,首先就要檢查動態庫的makefile寫的是否有問題。

            果然,發現makefile里沒有把該出錯函數所在的定義的源文件沒有編譯進去。

            ?

            ?

            三?問題解決

            ???? 找到了原因,問題解決就方便了。修改.so的makefile即可。

            svn diff

            -COM_SRCS := $(GENASRCDIR)/CGenaEngine.cpp
            +COM_SRCS := $(GENASRCDIR)/CGenaEngine.cpp?? $(HTTPSRCDIR)/CHttpMiniParser.cpp?? -----》把CHttpMiniParser.cpp??編譯進去。


            ?

            久久久久九国产精品| 99精品久久久久中文字幕| 久久久无码精品亚洲日韩软件| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 欧美久久亚洲精品| 天天躁日日躁狠狠久久| 国产精品免费久久久久电影网| 欧洲国产伦久久久久久久| 久久久一本精品99久久精品66| 亚洲精品国产成人99久久| 人人妻久久人人澡人人爽人人精品| 老色鬼久久亚洲AV综合| 精品久久人人做人人爽综合 | 国产精品久久新婚兰兰| 久久er99热精品一区二区| 热综合一本伊人久久精品| 精品久久久久久国产潘金莲 | 色偷偷久久一区二区三区| 国産精品久久久久久久| 人妻精品久久无码专区精东影业 | 亚洲精品乱码久久久久久按摩| 品成人欧美大片久久国产欧美| 伊人色综合久久天天人手人婷 | 亚洲欧美精品一区久久中文字幕 | 久久99精品久久久久久齐齐 | www.久久精品| 人妻少妇久久中文字幕| 亚洲人成无码www久久久| 色偷偷888欧美精品久久久| 久久亚洲精品无码AV红樱桃| 亚洲精品国产综合久久一线| 久久精品夜色噜噜亚洲A∨| 久久成人精品视频| 久久99国产精品一区二区| 久久亚洲欧美国产精品| 亚洲第一极品精品无码久久| 欧美日韩久久中文字幕| 亚洲天堂久久久| 狠狠综合久久AV一区二区三区| 欧美日韩中文字幕久久久不卡| 久久久久久国产a免费观看不卡|