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

            戰魂小筑

            討論群:309800774 知乎關注:http://zhihu.com/people/sunicdavy 開源項目:https://github.com/davyxu

               :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              257 隨筆 :: 0 文章 :: 506 評論 :: 0 Trackbacks

            最近頁游開放平臺比較多, 每個平臺要求的Linux版本各不相同, 這給開發人員部署服務器帶來了很大的困難. 在本機Linux編譯的程序,發布時即便將依賴的so附帶到目標Linux環境,仍然會碰到依賴及版本問題,例如:

            [root@localhost bin]# ldd wkcenter
            ./wkcenter: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./wkcenter)
            ./wkcenter: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./wkcenter)
            ./wkcenter: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./wkcenter)
            ./wkcenter: /lib/libc.so.6: version `GLIBC_2.9' not found (required by ./wkcenter)
            ./wkcenter: /lib/libc.so.6: version `GLIBC_2.7' not found (required by ./wkcenter)
            ./wkcenter: /lib/libc.so.6: version `GLIBC_2.8' not found (required by ./wkcenter)
            ./wkcenter: /lib/libc.so.6: version `GLIBC_2.11' not found (required by ./wkcenter)

                    linux-gate.so.1 =>  (0xffffe000)
                    liblog4cpp.so.4 => not found
                    libprotobuf.so.7 => not found
                    libboost_filesystem.so.1.48.0 => not found
                    libboost_system.so.1.48.0 => not found
                    libboost_thread.so.1.48.0 => not found
                    libboost_program_options.so.1.48.0 => not found
                    libunwind-x86.so.7 => not found
                    libluabind.so.0.9.0 => not found
                    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x008ae000)
                    libm.so.6 => /lib/libm.so.6 (0x0044b000)
                    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00476000)
                    libc.so.6 => /lib/libc.so.6 (0x002c1000)
                    libpthread.so.0 => /lib/libpthread.so.0 (0x0041d000)
                    librt.so.1 => /lib/librt.so.1 (0x00440000)
                    /lib/ld-linux.so.2 (0x002a2000)

            上面紅字部分表示glibc及glibcxx庫依賴不正確. 本人使用的Linux編譯版本為Mint 11(基于Ubuntu), 一般Ubuntu發行版的glibc配備非常高. 但是上文中的發布的Linux版本為CentOS 5.8

            使用/lib/libc.so.6 查看libc版本為2.5, 遠遠低于開發環境的2.11

            GNU C Library stable release version 2.5, by Roland McGrath et al.
            Copyright (C) 2006 Free Software Foundation, Inc.
            This is free software; see the source for copying conditions.
            There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
            PARTICULAR PURPOSE.
            Compiled by GNU CC version 4.1.2 20080704 (Red Hat 4.1.2-51).
            Compiled on a Linux 2.6.9 system on 2012-02-21.
            Available extensions:
                    The C stubs add-on version 2.1.2.
                    crypt add-on version 2.1 by Michael Glad and others
                    GNU Libidn by Simon Josefsson
                    GNU libio by Per Bothner
                    NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk
                    Native POSIX Threads Library by Ulrich Drepper et al
                    BIND-8.2.3-T5B
                    RT using linux kernel aio
            Thread-local storage support included.
            For bug reporting instructions, please see:
            <
            http://www.gnu.org/software/libc/bugs.html>.

            由于Linux操作系統的特有elf加載順序. (可以參考此文). 雖然可以很大程度上解決Windows早期版本的dll hell問題, 但是給部署帶來了很大難度

            一般常見的解決方法是, 找到一個與目標Linux版本及glibc版本一致的Linux, 將代碼及依賴包放在之上編譯, 完成后再發布.這種方法與Linux下常見軟件安裝方法類似. 但是對于商用服務器部署步驟來說未免繁瑣, 安全性低.

            還有一種方法,使用靜態鏈接. 將所有可執行文件文件依賴的靜態庫, 系統庫,全部靜態鏈接到可執行文件中,可以一次性解決這個問題

            步驟:

                1. 在gcc鏈接命令行中添加-static -static-libgcc -static-libstdc++

                2. 將第三方依賴庫打開靜態鏈接開關, 將原來鏈接.so的庫,全改為鏈接.a

                3. gcc對鏈接庫順序很敏感, 鏈接庫順序需要按照從前至后為:  項目產生的靜態庫 > 第三方庫靜態庫 > 系統靜態庫

                4. 鏈接時, 若有未解決的symbol, 可以嘗試在最后添加-lpthread及-lrt解決

               

            在發布版本Linux上運行可能遇到的問題:

            terminate called after throwing an instance of 'std::runtime_error'

            what(): locale::facet::_S_create_c_locale name not valid

            解決方法: 執行之前運行export LC_ALL="C"

            posted on 2012-04-20 11:35 戰魂小筑 閱讀(7196) 評論(4)  編輯 收藏 引用 所屬分類: 網絡 服務器技術C++/ 編程語言操作系統

            評論

            # re: 讓C/C++程序一次編譯可以發布到多版本Linux之上 2012-04-20 12:43 LOGOS
            也可以把缺失的so一同發布  回復  更多評論
              

            # re: 讓C/C++程序一次編譯可以發布到多版本Linux之上 2012-04-24 09:33 red
            靜態庫鏈接感覺并不是個很好的方案,穩定性不知道會不會有問題
            還有就是很多第三方庫的授權未必支持靜態庫  回復  更多評論
              

            # re: 讓C/C++程序一次編譯可以發布到多版本Linux之上 2014-01-23 15:37 molixiaoge
            為什么 -static 無法編譯  回復  更多評論
              

            # re: 讓C/C++程序一次編譯可以發布到多版本Linux之上 2014-05-12 09:27 長壽夢
            曾經我的執行程序依賴ssl庫,把原編譯環境的所有的so庫到拷貝過來,還是不行。直到把代碼在目標linux環境編譯完成,再運行,才沒問題。@LOGOS
              回復  更多評論
              

            国产精品久久久久久影院| 亚洲精品乱码久久久久66| 91久久精品国产免费直播| 精品国产乱码久久久久久浪潮| 久久WWW免费人成—看片| 97精品依人久久久大香线蕉97| 久久久久久久久无码精品亚洲日韩| 青青热久久综合网伊人| 伊人色综合九久久天天蜜桃| 国产产无码乱码精品久久鸭| 久久精品二区| 国产精品久久久久aaaa| 久久久午夜精品福利内容| 久久综合欧美成人| 亚洲中文字幕久久精品无码喷水 | 久久中文骚妇内射| 久久国产热这里只有精品| 影音先锋女人AV鲁色资源网久久| 色综合久久综精品| 99久久综合狠狠综合久久止| 久久久久久久综合狠狠综合| 国产精品久久久久久久久| 亚洲精品无码久久久影院相关影片| 91精品婷婷国产综合久久| 粉嫩小泬无遮挡久久久久久| 精品国产乱码久久久久久呢| 人人狠狠综合久久亚洲| 久久久久亚洲AV无码专区网站| 国产精品岛国久久久久| 狠狠88综合久久久久综合网| 中文字幕热久久久久久久| 区久久AAA片69亚洲| 久久亚洲国产精品123区| 久久亚洲精品无码播放| 久久精品国产99国产精品| 久久久久亚洲精品男人的天堂| 99久久精品免费看国产一区二区三区| 久久亚洲国产成人精品性色| 国产高潮国产高潮久久久| 97久久精品无码一区二区天美| 99久久久精品免费观看国产|