青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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 閱讀(1365) | 評論 (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 閱讀(1102) | 評論 (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 閱讀(3128) | 評論 (0)編輯 收藏

慚愧。。
posted @ 2014-07-05 12:31 runsisi 閱讀(182) | 評論 (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 閱讀(7784) | 評論 (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 閱讀(1251) | 評論 (0)編輯 收藏

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

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

僅列出標題
共5頁: 1 2 3 4 5 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品主播| 免费看成人av| 日韩一区二区精品| 欧美另类亚洲| 亚洲欧美电影院| 亚洲欧美国产日韩中文字幕| 国产欧美日韩在线播放| 久久精品在线播放| 欧美夫妇交换俱乐部在线观看| 久久综合综合久久综合| 亚洲国产精品va在线看黑人 | 日韩视频―中文字幕| 国产精品成人av性教育| 久久aⅴ国产欧美74aaa| 免费成人你懂的| 亚洲综合视频一区| 久久精品欧洲| 99热这里只有精品8| 亚洲欧美激情一区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美一区二视频| 欧美大香线蕉线伊人久久国产精品| 欧美电影在线观看| 亚洲一区二区三区成人在线视频精品| 久久精品欧洲| 欧美大片va欧美在线播放| 午夜精品久久久久久久久久久久 | 欧美中文在线观看| 欧美+亚洲+精品+三区| 亚洲在线一区二区三区| 久久久久久久久久久久久久一区| 国产欧美二区| 亚洲激情视频| 国产精品久久九九| 亚洲国产一区二区三区高清| 国产精品视区| 亚洲乱码国产乱码精品精98午夜| 久久久久综合一区二区三区| 亚洲视屏在线播放| 欧美成人综合一区| 美日韩精品视频| 国产欧美在线观看| 亚洲美女黄网| 亚洲精品少妇| 你懂的亚洲视频| 蜜桃精品一区二区三区| 国产亚洲毛片在线| 亚洲一区二区成人在线观看| 中文在线不卡| 欧美日韩你懂的| 亚洲人成网站在线播| 亚洲国产欧美日韩| 看片网站欧美日韩| 美女网站久久| 亚洲国产成人porn| 六月婷婷久久| 欧美韩国一区| 亚洲裸体视频| 欧美精品三级日韩久久| 亚洲黄一区二区三区| 亚洲欧洲精品一区二区三区不卡| 欧美二区在线观看| 136国产福利精品导航| 欧美亚洲在线视频| 久久久精品视频成人| 国产午夜精品久久久久久久| 亚洲欧美日韩在线播放| 欧美一区二区三区啪啪| 国产欧美一区二区精品仙草咪| 久久精品国产第一区二区三区最新章节 | 亚洲精品国产欧美| 美女成人午夜| 亚洲全部视频| 亚洲欧美另类在线| 国产亚洲欧美另类一区二区三区| 麻豆视频一区二区| 亚洲精品国偷自产在线99热| 欧美精品1区| 日韩午夜黄色| 久久av免费一区| 影音先锋中文字幕一区| 欧美大片免费看| 久久精品电影| 亚洲国产mv| 激情欧美日韩| 欧美大片免费观看| 亚洲一级在线观看| 久久久国产一区二区| 亚洲国产天堂久久国产91| 欧美精品18videos性欧美| 亚洲一区二区在| 欧美成人免费在线视频| 亚洲少妇最新在线视频| 国产尤物精品| 欧美日韩成人| 久久久久久久久久久久久女国产乱| 亚洲性色视频| 好看不卡的中文字幕| 欧美久久九九| 久久精品国产91精品亚洲| 91久久一区二区| 欧美在线一级视频| 99国产精品国产精品久久| 国产亚洲视频在线| 欧美日韩国产一区精品一区| 久久精品国产一区二区电影| 一区二区不卡在线视频 午夜欧美不卡在| 国产一级揄自揄精品视频| 久久一区免费| 欧美一区二区三区精品电影| 亚洲精品一区二区三区樱花 | 亚洲福利视频一区| 欧美午夜电影一区| 毛片基地黄久久久久久天堂| 亚洲一级片在线看| 亚洲精品久久久久| 久久人人爽国产| 午夜日韩视频| 一区二区免费看| 亚洲人成艺术| ●精品国产综合乱码久久久久| 久久九九国产精品| 亚洲永久免费av| 亚洲无毛电影| 亚洲美女福利视频网站| 亚洲欧洲精品一区二区三区| 久久综合伊人77777尤物| 久久9热精品视频| 午夜视频在线观看一区二区三区| 欧美性大战久久久久| 欧美黄色小视频| 久久青草久久| 蜜臀久久99精品久久久画质超高清| 亚洲国产99精品国自产| 久久免费高清| 久久久91精品国产一区二区三区| 经典三级久久| 国产一区白浆| 激情久久久久久久久久久久久久久久| 久久久中精品2020中文| 久久精品亚洲热| 久久精品国产96久久久香蕉| 久久九九精品99国产精品| 欧美中文字幕在线观看| 欧美一区在线视频| 久久久久久成人| 男女激情视频一区| 欧美激情一区三区| 欧美日韩在线观看一区二区| 欧美色123| 国产伦精品一区二区| 国产一区91| 亚洲激情小视频| 一区二区三区国产在线观看| 亚洲在线一区二区三区| 午夜精品在线| 99国产精品视频免费观看| 欧美一级二级三级蜜桃| 亚洲欧美卡通另类91av| 欧美一进一出视频| 另类激情亚洲| 欧美日韩亚洲视频| 国产精品亚洲一区| 一区二区三区在线不卡| 亚洲三级网站| 欧美亚洲午夜视频在线观看| 麻豆成人在线播放| 日韩亚洲视频| 欧美在线在线| 欧美激情影院| 国产日本亚洲高清| 亚洲激情一区| 欧美一区二区在线播放| 亚洲第一精品福利| 亚洲在线1234| 嫩模写真一区二区三区三州| 国产精品捆绑调教| 亚洲国产一二三| 午夜亚洲视频| 欧美护士18xxxxhd| 午夜精品短视频| 欧美精品日韩| 亚洲大胆av| 欧美一级理论性理论a| 欧美激情aaaa| 小嫩嫩精品导航| 欧美日韩亚洲视频| 亚洲国产婷婷综合在线精品| 欧美一级淫片aaaaaaa视频| 欧美激情精品久久久久久久变态| 久久久久久欧美| 中国av一区| 蜜桃久久精品乱码一区二区| 国产精品乱子久久久久| 日韩亚洲欧美一区| 欧美激情偷拍| 久久电影一区| 国产精品视频久久一区| 这里只有精品视频| 欧美高清视频在线|