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

            runsisi

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              45 隨筆 :: 15 文章 :: 26 評論 :: 0 Trackbacks

            #


            runsisi AT hust

            http://www.shnenglu.com/runsisi

             

            前期將FreeBSDTCP棧移到用戶態的時候沒有參考項目已有的Makefile,主要是項目的Makefile寫的太復雜,看上去有點暈,而且前期也基本上不需要依賴已有Makefile定義的變量,因此單獨弄了個Makefile,自我感覺良好:),以后一些小東西也可以繼續用~

            關于Makefile可以參考:http://www.gnu.org/software/make/manual/

             

            # author: runsisi AT hust

            # date: 2013/08/24

             

            .PHONY : all clean

             

            CC := /opt/zte/x86_64_gcc4.5.2_glibc2.13.0/bin/x86_64-pc-linux-gnu-gcc

            AR := /opt/zte/x86_64_gcc4.5.2_glibc2.13.0/bin/x86_64-pc-linux-gnu-ar

             

            CODE_DIR := $(CURDIR)/../../..

            ROOT_DIR := $(CURDIR)

            TARGET := $(ROOT_DIR)/libbsdtcp.a

             

            INC_DIRS := $(ROOT_DIR)/include \

                       $(ROOT_DIR)/include/opt \

                       $(ROOT_DIR)/include/amd64 \

                       $(ROOT_DIR)/include/x86 \

                       $(ROOT_DIR)/include/contrib/altq \

                       $(CODE_DIR)/dps/pub/include

                    

            SRC_DIRS := $(ROOT_DIR)/source/kern \

                       $(ROOT_DIR)/source/libkern \

                       $(ROOT_DIR)/source/net \

                       $(ROOT_DIR)/source/netinet \

                       $(ROOT_DIR)/source/vm

                      

            INCS := $(addprefix -I, $(INC_DIRS))

            SRCS := $(foreach dir, $(SRC_DIRS), $(wildcard $(dir)/*.c))

            OBJS := $(SRCS:.c=.o)

            DEPS := $(OBJS:.o=.d)

             

            MACROS := -D_KERNEL

            CFLAGS := -MD -MP $(INCS) $(MACROS)

             

            all : $(TARGET)

                @printf "Compilation done:)\n"

               

            $(TARGET) : $(OBJS)

                $(AR) -crs $@ $^

             

            %.o : %.c

                $(CC) -c $(CFLAGS) -o $@ $<

               

            -include $(DEPS)

             

            clean:

                @rm -f $(OBJS) $(DEPS) $(TARGET)

            /Files/runsisi/Makefile.pdf
            /Files/runsisi/Makefile.rar

            posted @ 2014-08-18 21:27 runsisi 閱讀(1349) | 評論 (0)編輯 收藏


            runsisi AT hust

            http://www.shnenglu.com/runsisi

            1.     NTP系統簡介

            如圖1,整個NTP系統以一種分層結構的形式存在,其中最頂層為原子鐘等精確時鐘設備,稱作參考時鐘(reference clock),NTP服務器按照距離參考時鐘的遠近被歸入不同的層(stratum),處于頂層(stratum 1)的NTP服務器與參考時鐘直連(黃色箭頭所示),被稱作主時間服務器(primary time server),處于其它層的NTP服務器通過網絡從同層或上層NTP服務器處獲取時間進行同步(紅色箭頭所示)。從圖中可以看到NTP服務器既可以作為服務端向其它機器提供時間服務,也可以作為客戶端從其他NTP服務器獲取時間進行同步。

            /Files/runsisi/內網環境ntp服務器搭建.pdf


            posted @ 2014-08-12 19:17 runsisi 閱讀(1095) | 評論 (0)編輯 收藏


            runsisi AT hust

            http://www.shnenglu.com/runsisi

            前言

            本文只適用于ceph測試環境的搭建,實際生產環境下的部署請參考ceph官方相關文檔。實際上ceph官方對測試環境的部署已有比較詳細的介紹,本文內容主要參考了官方的文檔,只是對部署過程稍作簡化,如需參閱官方文檔請點擊:http://ceph.com/docs/master/start/

            環境描述

            由于缺少實際硬件環境,我們使用VMware模擬所需的硬件環境,對于測試環境而言,這樣做無可厚非,理論上任意VMware版本應該都是可以的。

            Ceph只能部署在linux系統上,其運行環境對發行版理論上無要求,但ceph官方提供的ceph測試環境部署工具(ceph-deploy)可能對發行版有要求,同時ceph客戶端對內核以及glibc版本也有一定要求,具體環境要求請參閱官方文檔:http://ceph.com/docs/master/start/os-recommendations/

            Linux各發行版之間差異很大,官方的部署文檔基本上是分debianredhat兩種類型的發行版分別進行介紹,由于精力有限,本文不對debian系列(debian, ubuntu, linux mint, linuxdeepin等)進行介紹。

            本文用到的環境清單如下:

            硬件環境:VMware workstation 10.0.2

            軟件環境:Centos 7.0 x86_64

            準備工作

            cppblog對word2013的格式支持好像不好,直接上文檔吧。

            /Files/runsisi/ceph環境搭建.pdf

            posted @ 2014-07-31 10:09 runsisi 閱讀(3111) | 評論 (0)編輯 收藏

            慚愧。。
            posted @ 2014-07-05 12:31 runsisi 閱讀(175) | 評論 (0)編輯 收藏


            Powerline字體補丁

            runsisi AT hust

             @2013/05/03

            接上一篇。

             

            使用spf13vim插件,如果當前系統的vim支持python的話,會安裝 powerline插件,如果不支持的話則會安裝vim-powerlinepowerline相當于vim-powerline的升級版,后者的效果可以參看上一篇,前者的效果可以看下圖:


            看的出powerlinevim-power的效果要炫的多,但是使用powerline的話需要對終端使用的字體打補丁,不然會顯示亂碼(當然亂碼的原因也可能是終端編碼設置不對,這里只考慮字體的原因)。

            使用gnome-terminalkonsolelinux原生的終端也可以不給使用的字體打補丁,具體可以參考官方的文檔,但如果使用puttysecurecrt等遠程終端工具的話必須打補丁。

             

            Powerline插件自帶了補丁工具,如果直接使用spf13的腳本安裝的powerline插件,該工具在spf13-vim/.vim/bundle/powerline/font文件夾下:fontpatcher.py

            使用類似下面的命令,就可以給consola.ttf字體打補丁:

            ./fontpatcher.py consola.ttf

             

            我在使用該工具對consolas字體打補丁時遇到了一些問題:

            1.       The required FontForge modules could not be loaded.

            該工具依賴fontforge,但使用系統的包管理工具安裝了fontforge之后可能仍然出現該問題(至少在我的opensuse12.2 64bit下不能用),可以通過下載源碼重新編譯(configure時注意加上--enable-pyextension選項);

            2.       雖然重新編譯、安裝了fontforge,執行該工具時仍然可能出現1中的問題

            切換到fontforge源代碼目錄下的pyhook目錄,然后執行python setup.py install安裝fontforgepython模塊(不知道為什么fontforgemakefile會缺這一步)

            3.         打了補丁的字體puttysecurecrt等工具不認識,在字體設置無法選擇打了補丁的字體,或者使用了打了補丁的字體后powerline插件顯示的仍然是亂碼

            Github上有打了補丁的consolas等字體,但都有這個問題,可能只適用于linux下的原生終端使用,在網上找到了一個該字體工具的補丁,但是是針對老版的vim-powerline的,和新版工具差異太大,已經不能用了,參考它的思路,對新版的powerline字體工具打了個補丁如下:

            --- fontpatcher/old/fontpatcher.py    2013-05-03 23:23:11.788069924 +0800
            +++ fontpatcher/new/fontpatcher.py    2013-05-03 23:23:53.145073351 +0800
            @@ -22,14 +22,16 @@
             parser.add_argument('target_fonts', help='font files to patch', metavar='font', nargs='+', type=argparse.FileType('rb'))
             parser.add_argument('--no-rename', help='don\'t add " for Powerline" to the font name', default=True, action='store_false', dest='rename_font')
             parser.add_argument('--source-font', help='source symbol font', metavar='font', dest='source_font', default='{0}/fontpatcher-symbols.sfd'.format(sys.path[0]), type=argparse.FileType('rb'))
            +parser.add_argument('--fix-mono', help='fixes some mono-fonts which have glyphs of 0 widths', default=False, action='store_true', dest='fix_mono')
             args = parser.parse_args()
             
             
             class FontPatcher(object):
            -    def __init__(self, source_font, target_fonts, rename_font=True):
            +    def __init__(self, source_font, target_fonts, rename_font=True, fix_mono=False):
                     self.source_font = fontforge.open(source_font.name)
                     self.target_fonts = (fontforge.open(target_font.name) for target_font in target_fonts)
                     self.rename_font = rename_font
            +        self.fix_mono = fix_mono
             
                 def patch(self):
                     for target_font in self.target_fonts:
            @@ -40,10 +42,10 @@
             
                         # Rename font
                         if self.rename_font:
            -                target_font.familyname += ' for Powerline'
            -                target_font.fullname += ' for Powerline'
            +                target_font.familyname = 'Powerline ' + target_font.familyname
            +                target_font.fullname = 'Powerline ' + target_font.fullname
                             fontname, style = re.match("^([^-]*)(?:(-.*))?$", target_font.fontname).groups()
            -                target_font.fontname = fontname + 'ForPowerline'
            +                target_font.fontname = 'Powerline ' + fontname
                             if style is not None:
                                 target_font.fontname += style
                             target_font.appendSFNTName('English (US)''Preferred Family', target_font.familyname)
            @@ -102,6 +104,11 @@
                             # Reset the font's glyph width so it's still considered monospaced
                             target_font[source_glyph.unicode].width = target_font_width
             
            +            if self.fix_mono:
            +                for target_glyph in target_font.glyphs():
            +                    if target_glyph.width == 0:
            +                        target_glyph.width = target_font_width
            +
                         target_font.em = target_font_em_original
             
                         # Generate patched font
            @@ -111,5 +118,5 @@
                             extension = '.otf'
                         target_font.generate('{0}{1}'.format(target_font.fullname, extension))
             
            -fp = FontPatcher(args.source_font, args.target_fonts, args.rename_font)
            +fp = FontPatcher(args.source_font, args.target_fonts, args.rename_font, args.fix_mono)
             fp.patch()

            使用如下的命令對consola字體打補丁,然后安裝字體就可以在puttysecurecrt等工具中使用了:

            ./fontpatcher.py –fix-mono consola.ttf

             

            我在github上傳了一份打了補丁的consolas字體,下載之后可以直接使用:

            https://github.com/runsisi/consolas-font-for-powerline

             

            同時我也在github上上傳了一份打包好了的spf13插件,只需要解壓然后執行./install.sh即可(注意要求vim7.3,且vim支持python):

            https://github.com/runsisi/a-ready-to-use-vimrc

            /Files/runsisi/powerline_fontpatcher.pdf
            /Files/runsisi/fontpatcher.rar
            /Files/runsisi/fontpatcher_diff.rar
            posted @ 2013-05-04 00:32 runsisi 閱讀(7762) | 評論 (2)編輯 收藏

            vim配置總結

                                                                                                                                                    runsisi AT hust
             @2013/04/06

            12年的最后一天配置了一下公司RHEL上的vim,公司的網絡不允許上傳東西和外發郵件,因此總結得回家寫,沒有RHEL的環境,不過用CentOSopenSUSE也是一樣的。

            畢業快一年了,雖然一直是在Linux下開發,但很多時候還是在Windows下面編碼,然后用git pushRHEL上去編譯,在學校的時候偶爾也照著網絡上的博文給vim配置類似IDE的東東,但一個一個插件的來配置挺繁瑣的,而且VCeclipse之類的用久了,終究用的不是很習慣,想想用linux這么多年了對vim的使用還停留在入門水平吧:)

            給個在SecureCRT中的效果圖,機器硬盤太小,只能用虛擬機將就了^^


            看上去還不錯,配色、自動補全、狀態欄提示等功能都非常不錯,對于代碼編輯而言,應該是完全夠用了,不過C/C++符號之間的定義、調用關系的跳轉、查找等還是太弱,跟eclipsesource insight比感覺不是一個檔次。

             

            其實整個配置很簡單,基本都是用的githubspf13大牛的vim配置,只是調整了個別選項以適應自己的環境。

            先簡單介紹下我自己的環境:CentOS 6.3 64bit / openSUSE 12.2 64bit,終端為SecureCRT 7.0,其中SecureCRT的終端模擬器選項選擇的Linux,且勾選后面的兩個復選框,外觀選項中顏色樣式選擇的為Black / Floral White,如下圖所示:



            如果是直接使用的gnome-terminal/konsole的話,將背景顏色設置成如下就可以了:


             


            有兩種安裝方法:1)自動安裝模式;2)手動安裝模式。但都要求vim的版本為7.3及以上并且要求在編譯時加上某些功能模塊,如果是自己編譯的話需要將pythonmulti_byte等功能加上,可以使用如下的編譯選項--enable-cscope --enable-multibyte --enable-perlinterp=yes --enable-pythoninterp=yes --enable-rubyinterp=yes。如果直接使用zypperyum等包管理器安裝的話,可以安裝vim-enhanced這個版本,不過centos6.3RHEL6.0自帶的包都沒有vim7.3需要自己手工編譯,或者去網上下載已經編譯好的版本。

             

            1)自動安裝模式

            其實如果有網絡,且能使用gitgithub.com拉版本的話,配置過程超級簡單,因為github上有現成的配置腳本,可以點擊該鏈接查看:https://github.com/spf13/spf13-vim,簡單介紹一下配置流程:

            1.       使用githttps://github.com/spf13/spf13-vim.git拉一個版本到本地;

            2.       切換到本地版本工作目錄,給目錄下的bootstrap.sh添加上可執行權限;

            3.       執行剛才的腳本,只需要等待就好了,會自動下載其他的vim插件的;

            4.       然后修改~/.vimrc或者新建一個~/.vimrc.local,加上下面這一句,將終端顏色設置成256色:set t_Co=256,這樣就可以了。

             

            2)手動安裝模式

            如果網絡環境不支持git的話,就什么都需要手動安裝了。手動模式安裝太繁瑣了,其實就是參考spf13-vim/bootstrap.sh腳本的操作。

            1.       訪問https://github.com/spf13/spf13-vim,點擊“zip”按鈕,打包下載該插件,并解壓

            2.       參照spf13-vim/bootstrap.sh文件中的操作,將原有的vim配置文件備份,然后將新的配置文件鏈接到~/目錄下

            3.       手動下載https://github.com/gmarik/vundle這個插件,解壓并去掉文件夾名中最后的”-master”,并將該文件夾拷貝到~/.vim/bundle文件夾下,沒有該文件夾則新建

            4.       修改spf13-vim/.vimrc.bundles文件,該配置文件中的類似Bundle 'xxx/yyy'的一行實際上就是github上的一個vim插件路徑,如Bundle 'gmarik/vundle'URL路徑就是https://github.com/gmarik/vundle。直接修改let g:spf13_bundle_groups可以去掉一些不需要的插件組,每個插件組包括的插件都在該配置文件的下面定義了,如果不想將整個插件組都去掉,可以在插件組的定義處刪掉一些不需要的插件,但要注意在該配置文件開頭,“Deps”注釋下面的插件是必須的,不能刪掉

            5.       然后一個個將這些插件手動下載,解壓,去掉文件夾名最后的”-master”,然后放到~/.vim/bundle/下面

            6.       最后按照spf13-vim/bootstrap.sh最后的安裝命令安裝即可

            7.       按照上面自動模式中的第4條,增加一條終端顏色配置即可。

            /Files/runsisi/vim簡單配置.pdf

            posted @ 2013-04-06 16:17 runsisi 閱讀(1239) | 評論 (0)編輯 收藏

            今天終于發2月份的工資了,果然如天涯上所說加工資了,不過又是250。。。
            因為年前和年后各調休一天又扣了700,即使平時的加班不能用來調休了,但當時不是說可以用年假調的嗎。。
            去年11月被評為優秀員工,以為有獎金,結果12月份工資一出來,啥都沒有,以為半年考核優秀的才有。。
            年前被評為12年下半年優秀員工,對2月份的工資滿心期待,結果還是啥都沒有。。
            作為優秀員工中唯一的新人,也只有精神鼓勵了,但沒有任何一點點的物質獎勵,有點點失望。。
            天涯上說3月還要裁員,這樣的話,在進來還不到一年的時間內馬上就會經歷第三次裁員了。。
            posted @ 2013-03-11 21:58 runsisi 閱讀(578) | 評論 (2)編輯 收藏

            年前說給scienceluo寫一個這樣的腳本,很簡單的邏輯,實現的功能為在linux下建一個svn的版本庫,考慮的條件也很簡單,只能用在平時寫代碼的時候為了方便臨時建個svn的版本庫用用~~
            在openSUSE-12.2, CentOS-6.3, 以及RHEL6.0(均為64bit環境)下簡單測試通過:),ubuntu-12.10默認的shell為dash(當然可以指定使用bash),且對awk的gensub函數不支持,所以該腳本無法在ubuntu下使用(可以用sed實現同樣的功能,但懶得弄了,平時也用不到ubuntu的環境)~
            腳本支持建立多個版本庫,但如果想要同時訪問,則多個版本庫要在相同的父目錄下,否則的話就只能訪問最新建的那個版本庫了,因為啟動svnserve服務器時指定的服務器根目錄參數填的是用戶最新建的那個svn版本庫路徑的父目錄;
            還一個需要注意的地方,建立的版本庫必須用svn://127.0.0.1/test_repo類似這樣的路徑來訪問,注意紅色的svn://前綴,因為服務器用的是subversion自帶的獨立服務器~

            /Files/runsisi/mksvn.rar


            #! /bin/sh

            # author runsisi@hust.edu.cn
            #
             date 2013/02/05
            #
             modified 2013/02/12

            # variables forward declaration, it is not neccessary for shell script though
            svn_repo_root_dir=""

            function is_subversion_exist()
            {
                which svnadmin > /dev/null 2>&1
                [ $? -eq 0 ] && return 1
                return 0
            }

            function is_sys_root_dir()
            {
                echo $1 | awk '{if ($0 ~ /^\/$/) exit 1; else exit 0;}'
            }

            function is_relative_path()
            {
                echo $1 | awk '{if ($0 ~ /^\//) exit 0; else exit 1;}'
            }

            function get_svn_root_dir()
            {
                read -e -p "輸入要創建的svn根目錄:" svn_repo_root_dir
                [ -z "$svn_repo_root_dir" ] && echo "非法路徑,abort!" && return 1
                # whitespaces at each end of the path are trimed
                svn_repo_root_dir=$(echo "$svn_repo_root_dir" | sed 's/^[[:blank:]]*\(\)[[:blank:]]*$/\1/g')
                is_sys_root_dir "$svn_repo_root_dir"
                [ $? -eq 1 ] && echo "非法路徑,不能是根目錄,abort!" && return 1
                # get rid of last / character(s) in path
                svn_repo_root_dir=$(echo "$svn_repo_root_dir" | sed 's/\(\)\/*$/\1/g')
                # escape whitespaces inside path
                svn_repo_root_dir=$(echo "$svn_repo_root_dir" | sed 's/ /\\ /g')
                # expand ~ character in path
                eval svn_repo_root_dir="$svn_repo_root_dir"
                # test if this path already exist
                [ -e "$svn_repo_root_dir" ] && echo "該svn路徑已存在,請刪除后再創建,abort!" && return 1
                # test if this path is a relative path or not
                is_relative_path "$svn_repo_root_dir"
                # convert to absolute path
                [ $? -eq 1 ] && svn_repo_root_dir=$(pwd)/$svn_repo_root_dir
                return 0
            }

            function create_svn_repo()
            {
                mkdir -p $(dirname "$1")
                svnadmin create "$1"
                return 0
            }

            function edit_svn_conf_file()
            {
                svn_repo_conf_dir="$1/conf"
                awk '{
                    if ($0 ~ /^#[[:blank:]]*anon-access/)
                        print gensub(/^#[[:blank:]]*(anon-access)/, "\\1", "g");
                    else if ($0 ~ /^#[[:blank:]]*auth-access/)
                        print gensub(/^#[[:blank:]]*(auth-access)/, "\\1", "g");
                    else if ($0 ~ /^#[[:blank:]]*password-db/)
                        print gensub(/^#[[:blank:]]*(password-db)/, "\\1", "g");
                    else print;}' "$svn_repo_conf_dir/svnserve.conf" > "$svn_repo_conf_dir/tmp_svnserve.conf"
                rm -f "$svn_repo_conf_dir/svnserve.conf"
                mv "$svn_repo_conf_dir/tmp_svnserve.conf" "$svn_repo_conf_dir/svnserve.conf"
                vi "$svn_repo_conf_dir/passwd"
                return 0
            }

            function start_svn_server()
            {
                killall -9 svnserve 2&> /dev/null
                svnserve -d -r $(dirname "$1")
                return 0
            }

            function main()
            {
                is_subversion_exist
                [ $? -eq 0 ] && echo "subversion不存在,需要先安裝subversion" && return 1
                get_svn_root_dir
                [ ! $? -eq 0 ] && return 1
                create_svn_repo "$svn_repo_root_dir"
                [ ! $? -eq 0 ] && return 1
                edit_svn_conf_file "$svn_repo_root_dir"
                [ ! $? -eq 0 ] && return 1
                start_svn_server "$svn_repo_root_dir"
                [ ! $? -eq 0 ] && return 1
                return 0
            }

            main
            posted @ 2013-02-16 21:44 runsisi 閱讀(1001) | 評論 (0)編輯 收藏

            php-gd擴展庫交叉編譯

            runsisi AT hust
             @2012/10/05

            為了給一做web的同事解決交叉編譯的問題,長假的第一天看了下,所以有了這個東東~

            1. 編譯環境

            OS: LinuxDeepin 12.06 (based on ubuntu 12.04) 32bit(以下的討論亦只限于GNU/Linux環境下)

            HW: Intel Pentium processor T4300, DDRII 667 3GB

            編譯器:arm-linux-gnueabi-gcc,理論上其他powerpc,mingw等GCC均可以

            Src version:

            Php: v5.4.7 zlib: v1.2.7 libpng: v1.5.12 libjpeg: v8d


            2. 交叉編譯和本地編譯的區別

            1)輸入

            相同,同樣是那些源代碼,配置腳本

            2)輸出

            不同,交叉編譯的輸出一般為在其他cpu架構/系統上(更確切的說是具有不同ABI接口的系統上)運行或加載的可執行文件或庫,它的輸出一般情況下不能在交叉編譯器運行的平臺下運行或被加載

            3)工具

            不能簡單的說相同或者不同,對于編譯鏈接等用到的工具鏈肯定不同,例如在我的機器上裝了四個針對不同目標平臺的gcc編譯器:

            ①runsisi@runsisi-Aspire-4736Z:~/Desktop$ gcc -v

            Using built-in specs.

            COLLECT_GCC=gcc

            COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.6/lto-wrapper

            Target: i686-linux-gnu

            ②runsisi@runsisi-Aspire-4736Z:~/Desktop$ arm-linux-gnueabi-gcc -v

            Using built-in specs.

            COLLECT_GCC=arm-linux-gnueabi-gcc

            COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabi/4.6/lto-wrapper

            Target: arm-linux-gnueabi

            ③COLLECT_GCC=/opt/eldk-5.2.1/powerpc/sysroots/i686-eldk-linux/usr/bin/powerpc-linux/powerpc-linux-gcc

            COLLECT_LTO_WRAPPER=/opt/eldk-5.2.1/powerpc/sysroots/i686-eldk-linux/usr/libexec/powerpc-linux/gcc/powerpc-linux/4.6.4/lto-wrapper

            Target: powerpc-linux

            ④runsisi@runsisi-Aspire-4736Z:~/Desktop$ i686-w64-mingw32-gcc -v

            Using built-in specs.

            COLLECT_GCC=i686-w64-mingw32-gcc

            COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-w64-mingw32/4.6/lto-wrapper

            Target: i686-w64-mingw32

            注意每一個打印的最后一行”Target“,表明該編譯器的輸出是針對該平臺的。

            編譯用到的工具除了編譯工具鏈之外,還有configure腳本等(當然對于不是使用autotools進行源代碼發布的開源工程,本段就沒有討論的意義了),對于交叉編譯而言,configure腳本需要使用不同的參數進行調用,有兩個最重要的參數:1)指定交叉編譯器,可以在執行configure腳本之前執行export CC=arm-linux-gnueabi-gcc,或者像這樣:./configure CC=arm-linux-gnueabi-gcc作為configure腳本參數進行指定;2)由于交叉編譯出來的可執行文件在當前的平臺無法運行,所以另外一個參數是告訴configure腳本,我們當前是要進行交叉編譯,一些需要通過編譯測試程序然后運行測試程序才能得到編譯參數的操作就不要進行了,當然還有其他一些編譯參數可能針對不同的平臺有默認值,該指定交叉編譯目標平臺的參數以configure腳本參數的形式進行指定,如:./configure –-host=arm-linux,具體—host之后指定的目標平臺是arm-linux, powerpc-linux還是別的貌似不是太重要,只要不是當前編譯器所在平臺可以運行的平臺就可以了,但是我們還是針對自己需要的目標平臺指定為好

            4)gcc默認搜索路徑

            gcc編譯器在編譯和調用ld進行鏈接的時候會去默認路徑下搜索頭文件和庫文件,可以使用gcc的 -print-search-dirs參數打印當前的默認搜索路徑,如:

            runsisi@runsisi-Aspire-4736Z:~/Desktop$ i686-w64-mingw32-gcc -print-search-dirs

            install: /usr/lib/gcc/i686-w64-mingw32/4.6/

            programs: =/usr/lib/gcc/i686-w64-mingw32/4.6/:/usr/lib/gcc/i686-w64-mingw32/4.6/:/usr/lib/gcc/i686-w64-mingw32/:/usr/lib/gcc/i686-w64-mingw32/4.6/:/usr/lib/gcc/i686-w64-mingw32/:/usr/lib/gcc/i686-w64-mingw32/4.6/../../../../i686-w64-mingw32/bin/i686-w64-mingw32/4.6/:/usr/lib/gcc/i686-w64-mingw32/4.6/../../../../i686-w64-mingw32/bin/

            libraries: =/usr/lib/gcc/i686-w64-mingw32/4.6/:/usr/lib/gcc/i686-w64-mingw32/4.6/../../../../i686-w64-mingw32/lib/i686-w64-mingw32/4.6/:/usr/lib/gcc/i686-w64-mingw32/4.6/../../../../i686-w64-mingw32/lib/../lib/:/usr/lib/gcc/i686-w64-mingw32/4.6/../../../../i686-w64-mingw32/lib/

            從打印可以看出,交叉編譯器并不會從當前系統目錄下搜索頭文件和庫,所以不需要擔心在交叉編譯器會搞混。注意:如果在CFLAGS中使用—sysroot指定root的位置的話,用戶自定義的-I,-L都會以--sysroot指定的root為root


            3. gd擴展庫編譯方式

            對于編譯gd擴展庫,存在兩種方法,下面分別說明:

            1)直接和php集成,編譯進最終的php可執行文件中,在php v4.x.x版本之后php的源代碼里面就帶了gd擴展庫的源代碼(在源代碼樹ext/gd下面)(具體版本為多少不關心,我也不是搞php的,反正v5.x.x肯定是這樣的~),在執行./configure編譯php時帶上—with-gd的選項就表明將gd編譯進php,不過php官方說gd庫還依賴libpng和libjpeg,而libpng又依賴libz,所以在./configure的選項中必須同時指定這三個庫的位置,以下為我的編譯選項:

            runsisi@runsisi-Aspire-4736Z:~/Desktop/php/php-5.4.7$ export CC=arm-linux-gnueabi-gcc

            runsisi@runsisi-Aspire-4736Z:~/Desktop/php/php-5.4.7$./configure --prefix=/home/runsisi/target --with-gd --disable-libxml --disable-dom --with-zlib-dir=/home/runsisi/target --with-jpeg-dir=/home/runsisi/target --with-png-dir=/home/runsisi/target --host=arm-linux --disable-simplexml --disable-xml --disable-xmlreader --disable-xmlwriter --without-pear –disable-phar

            注意五個用特殊顏色標記出來了的部分,紫色部分指定交叉編譯器;粉紅色—prefix指定make install時php被安裝到的位置,這個非常重要,如果不指定,會安裝到系統默認的/usr/local下面,而我們交叉編譯的php在當前系統是根本無法執行的,這會把系統的php搞亂,所以一定要指定自己的安裝路徑;綠色的—with-gd表示我們要集成gd庫;深紅色的選項指定zlib,jpeg,png三個庫的位置,注意這三個庫也必須是使用交叉編譯器編譯出來的庫;藍色的—host表明我們現在在進行交叉編譯;其他選項不要問我,我只是為了在編譯時不出現找不到相應庫的錯誤所以屏蔽掉了那些擴展,具體這些擴展是做什么我也不懂~,最后一個–disable-phar選項簡單說下,如果不屏蔽掉,在make最后階段會出錯,解決方法是使用本機的php去打包(具體打包什么我也不知道,makefile里面用到了phar這個擴展功能),因為交叉編譯的php不可能運行,所以肯定會出錯,phar應該就是個和jar,rar類似的功能,屏蔽掉應該也沒什么問題。

            2)既然gd庫只是個擴展,那么肯定可以單獨編譯,這應該就是網上所說的什么追加方式進行編譯。gd的官網都已經掛了,那么肯定直接使用php維護的gd進行編譯。

            編譯的步驟如下:①切換到php源代碼目錄ext/gd下面,執行php安裝目錄下的phpize ②執行configure,make一系列操作,在ext/gd/modules目錄下就有gd.so存在了,如果在configure時指定prefix為php的安裝目錄,那么make install就會把gd的頭文件和gd.so都拷貝到php安裝目錄下去.

            所有人都說在編譯之前需要執行phpize這個腳本,但是從來沒人說為什么,其實這個腳本做的就是得到一些宏定義,為擴展庫生成configure腳本等,注意要打開這個文件,對最開始兩行的prefix和datarootdir根據當前php實際所在的位置進行修改,比如我當初是把php make install安裝在/home/runsisi/target下面,但是后來我把它移到/home/runsisi/Desktop/php-target下面了,那就要做下面相應的修改:

            orig:

            prefix='/home/runsisi/target'

            datarootdir='/home/runsisi/target/php'

            modified:

            prefix='/home/runsisi/Desktop/php-target'

            datarootdir='/home/runsisi/Desktop/php-target/php'


            4. 幾點討論

            1)使用直接集成gd庫的方法時,zlib,png,jpeg庫可以是靜態庫,也可以是動態庫,但單獨編譯gd庫時zlib,png,jpeg必須全部是動態庫,因為此時gd被編譯成動態庫,具體原因我這點linker&loader的知識還不夠解釋:),但拿windows下生成庫的種類來看,可以知道具體鏈接什么庫是很很有講究的。。。

            windows下vc生成庫時,一般有如下幾種選擇:

            靜態庫/動態庫 Ⓧ debug版/release版 Ⓧ 靜態鏈接/動態鏈接C運行時庫

            2)在php的Makefile中有一處宏定義CFLAGS_CLEAN硬編碼成了-I/usr/include -g -O2 -fvisibility=hidden,這個地方可能需要修改,其實把-I/usr/include這句去掉都無所謂;在EXTRA_LDFLAGS_PROGRAM后面要加上-ldl,不然會鏈接出錯

            3)查看交叉編譯好的程序依賴什么庫,由于沒有現成的ldd,可以使用其他工具,如:

            runsisi@runsisi-Aspire-4736Z:~/Desktop/target/bin$ arm-linux-gnueabi-readelf -d php | grep NEEDED

            0x00000001 (NEEDED) Shared library: [libdl.so.2]

            0x00000001 (NEEDED) Shared library: [libm.so.6]

            0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]

            0x00000001 (NEEDED) Shared library: [libc.so.6]

            0x00000001 (NEEDED) Shared library: [ld-linux.so.3]

            4)靜態庫的鏈接順序很重要,如果liba依賴libb,請以這樣指定鏈接順序:-la -lb

            5)如果靜態庫的鏈接存在循環依賴問題,請使用ld的--start-group archives –end-group選項


            5. 具體的編譯步驟,分上述的兩種方式進行

            1)集成進php的方式(默認都動態鏈接zlib,png,jpeg等庫,如果目錄下同時存在靜態庫和動態庫,gcc會默認選擇靜態庫進行鏈接)(假設php,libz,libpng,libjpeg的源代碼壓縮包都在同一個目錄下)

            首先設置交叉編譯器(以arm gcc為例)

            $ export CC=arm-linux-gnueabi-gcc

            ①編譯zlib

            $ tar xvzf zlib-1.2.7.tar.gz

            $ cd zlib-1.2.7/

            $ ./configure –prefix=/home/runsisi/target

            出現錯誤:

            ./ztest8154: 1: ./ztest8154: Syntax error: word unexpected (expecting ")")

            Looking for a four-byte integer type... Not found.

            由于zlib并非使用的標準autotools,沒有考慮交叉編譯的情況,這個錯誤是執行測試程序導致的,用于檢測32bit整型是int還是long還是別的,該錯誤無關緊要,忽略即可

            $ make

            $ make install

            ②編譯libpng

            $ cd ..

            $ tar xvzf libpng-1.5.12.tar.gz

            $ cd libpng-1.5.12/

            注意使用CFLAGS指定zlib的位置

            $ ./configure --prefix=/home/runsisi/target CFLAGS="-I/home/runsisi/target/include -L/home/runsisi/target/lib" –host=arm-linux

            $ make

            $ make install

            ③編譯libjpeg

            $ cd ..

            $ tar xvzf jpegsrc.v8d.tar.gz

            $ cd jpeg-8d/

            $ ./configure --prefix=/home/runsisi/target –host=arm-linux

            $ make

            $ make install

            ④編譯php

            $ cd ..

            $ tar xvf php-5.4.7.tar

            $ ./configure --prefix=/home/runsisi/target --with-gd --disable-libxml --disable-dom --with-zlib-dir=/home/runsisi/target --with-jpeg-dir=/home/runsisi/target --with-png-dir=/home/runsisi/target --host=arm-linux --disable-simplexml --disable-xml --disable-xmlreader --disable-xmlwriter --without-pear –disable-phar

            打開php-5.4.7/Makefile

            修改67行附近CFLAGS_CLEAN = -I/usr/include -g -O2 -fvisibility=hidden為:

            CFLAGS_CLEAN = -g -O2 -fvisibility=hidden

            修改76行附近EXTRA_LDFLAGS_PROGRAM = -L/home/runsisi/target/lib為:

            EXTRA_LDFLAGS_PROGRAM = -L/home/runsisi/target/lib -ldl

            $ make

            $ make install

            ⑤將/home/runsisi/target目錄下php及依賴的動態庫libz,libpng,libjpeg等打包好即可

            查看php依賴的動態庫如下:

            runsisi@runsisi-Aspire-4736Z:~/target/bin$ arm-linux-gnueabi-readelf -d php | grep NEEDED

            0x00000001 (NEEDED) Shared library: [libdl.so.2]

            0x00000001 (NEEDED) Shared library: [libpng15.so.15]

            0x00000001 (NEEDED) Shared library: [libz.so.1]

            0x00000001 (NEEDED) Shared library: [libjpeg.so.8]

            0x00000001 (NEEDED) Shared library: [libm.so.6]

            0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]

            0x00000001 (NEEDED) Shared library: [libc.so.6]

            0x00000001 (NEEDED) Shared library: [ld-linux.so.3]

            整個安裝目錄(/home/runsisi/target)下的文件如下:

            .

            ├── bin

            │   ├── cjpeg

            │   ├── djpeg

            │   ├── jpegtran

            │   ├── libpng15-config

            │   ├── libpng-config -> libpng15-config

            │   ├── php

            │   ├── php-cgi

            │   ├── php-config

            │   ├── phpize

            │   ├── rdjpgcom

            │   └── wrjpgcom

            ├── include

            │   ├── jconfig.h

            │   └── ...

            ├── lib

            │   ├── libjpeg.a

            │   ├── libjpeg.la

            │   ├── libjpeg.so -> libjpeg.so.8.4.0

            │   ├── libjpeg.so.8 -> libjpeg.so.8.4.0

            │   ├── libjpeg.so.8.4.0

            │   ├── libpng15.a

            │   ├── libpng15.la

            │   ├── libpng15.so -> libpng15.so.15.12.0

            │   ├── libpng15.so.15 -> libpng15.so.15.12.0

            │   ├── libpng15.so.15.12.0

            │   ├── libpng.a -> libpng15.a

            │   ├── libpng.la -> libpng15.la

            │   ├── libpng.so -> libpng15.so

            │   ├── libz.a

            │   ├── libz.so -> libz.so.1.2.7

            │   ├── libz.so.1 -> libz.so.1.2.7

            │   ├── libz.so.1.2.7

            │   ├── php

            │   │   └── build

            │   │   ├── acinclude.m4

            │   │   ├── config.guess

            │   │   ├── config.sub

            │   │   ├── libtool.m4

            │   │   ├── ltmain.sh

            │   │   ├── Makefile.global

            │   │   ├── mkdep.awk

            │   │   ├── phpize.m4

            │   │   ├── run-tests.php

            │   │   ├── scan_makefile_in.awk

            │   │   └── shtool

            │   └── pkgconfig

            │   ├── libpng15.pc

            │   ├── libpng.pc -> libpng15.pc

            │   └── zlib.pc

            ├── php

            │   └── ...

            └── share

            └── ...

            42 directories, 309 files

            2)單獨編譯gd擴展庫的方式

            ①首先設置交叉編譯器

            ②libz,libpng,libjpeg同樣需要按照第一種方式進行交叉編譯

            ③假設libz,libpng,libjpeg安裝在/home/runsisi/libs-target中,而php編譯make install時的位置在/home/runsisi/target中,但后來移動至/home/runsisi/Desktop/php-target中

            ④打開/home/runsisi/Desktop/php-target/bin/phpize,在第4行附近,修改:

            prefix='/home/runsisi/target'

            datarootdir='/home/runsisi/target/php'

            為:

            prefix='/home/runsisi/Desktop/php-target'

            datarootdir='/home/runsisi/Desktop/php-target/php'

            ⑤打開/home/runsisi/Desktop/php-target/bin/php-config
            第4行附近,修改:

            prefix="/home/runsisi/target"

            datarootdir="/home/runsisi/target/php"

            為:

            prefix="/home/runsisi/Desktop/php-target"

            datarootdir="/home/runsisi/Desktop/php-target/php"

            在第11行附近,修改:

            ldflags=" -L/home/runsisi/target/lib"

            為指向libz,libpng,libjpeg的安裝位置

            ldflags=" -L/home/runsisi/target/libs-target"

            在13行附近,修改

            extension_dir='/home/runsisi/target/lib/php/extensions/no-debug-non-zts-20100525'

            為:

            extension_dir='/home/runsisi/Desktop/php-target/lib/php/extensions/no-debug-non-zts-20100525'

            ⑥開始編譯gd擴展庫

            $ tar xvf php-5.4.7.tar

            $ cd php-5.4.7/ext/gd

            $ /home/runsisi/Desktop/php-target/bin/phpize

            $ ./configure --prefix=/home/runsisi/Desktop/php-target --host=arm-linux --with-php-config=/home/runsisi/Desktop/php-target/bin/php-config --with-zlib-dir=/home/runsisi/libs-target --with-png-dir=/home/runsisi/libs-target --with-jpeg-dir=/home/runsisi/libs-target

            $ make

            $ make install

            查看gd.so依賴的動態庫如下:

            runsisi@runsisi-Aspire-4736Z:~/Desktop/php-target/lib/php/extensions/no-debug-non-zts-20100525$ arm-linux-gnueabi-readelf -d gd.so | grep NEEDED

            0x00000001 (NEEDED) Shared library: [libpng15.so.15]

            0x00000001 (NEEDED) Shared library: [libz.so.1]

            0x00000001 (NEEDED) Shared library: [libjpeg.so.8]

            0x00000001 (NEEDED) Shared library: [libc.so.6]

            0x00000001 (NEEDED) Shared library: [ld-linux.so.3]

            php-target下面的文件如下:

            .

            ├── bin

            │   ├── php

            │   ├── php-cgi

            │   ├── php-config

            │   └── phpize

            ├── include

            │   └── ...

            ├── lib

            │   └── php

            │   ├── build

            │   │   ├── acinclude.m4

            │   │   ├── config.guess

            │   │   ├── config.sub

            │   │   ├── libtool.m4

            │   │   ├── ltmain.sh

            │   │   ├── Makefile.global

            │   │   ├── mkdep.awk

            │   │   ├── phpize.m4

            │   │   ├── run-tests.php

            │   │   ├── scan_makefile_in.awk

            │   │   └── shtool

            │   └── extensions

            │   └── no-debug-non-zts-20100525

            │   └── gd.so

            └── php

            └── ...

            37 directories, 263 files


            /Files/runsisi/php-gd安裝.pdf

             

            posted @ 2012-10-08 22:09 runsisi 閱讀(3012) | 評論 (0)編輯 收藏

            好久沒來啦~
            posted @ 2012-08-30 22:47 runsisi 閱讀(159) | 評論 (0)編輯 收藏

            僅列出標題
            共5頁: 1 2 3 4 5 
            久久久久亚洲av无码专区喷水 | 久久露脸国产精品| 国产成人精品久久亚洲| 久久精品国产99久久香蕉| 中文字幕久久亚洲一区| 国产Av激情久久无码天堂| 久久99精品国产99久久6男男| 久久国产免费| 久久国产精品77777| 久久国产精品免费一区| 伊人久久大香线蕉综合Av | 69久久夜色精品国产69| 久久国产免费| 国产成人久久精品区一区二区| 久久婷婷色综合一区二区| 久久精品国产亚洲77777| 久久久久亚洲精品无码网址| 亚洲∧v久久久无码精品| 欧美精品丝袜久久久中文字幕 | 久久乐国产精品亚洲综合| 久久无码人妻一区二区三区午夜| 久久久久久国产精品无码下载| 久久人人妻人人爽人人爽| 欧美色综合久久久久久| 品成人欧美大片久久国产欧美... 品成人欧美大片久久国产欧美 | 四虎国产精品成人免费久久| 亚洲一区二区三区日本久久九| 亚洲va久久久噜噜噜久久男同| 亚洲欧美日韩久久精品| 久久青青草原亚洲av无码 | 思思久久精品在热线热| 手机看片久久高清国产日韩| 国内精品免费久久影院| 国产午夜电影久久| 91久久香蕉国产熟女线看| 久久国产乱子精品免费女| 国产综合久久久久| 91精品国产综合久久久久久| 99久久成人国产精品免费| 99久久中文字幕| 久久99国产精品久久久 |