編譯安裝軟件包之Apache

到達咱們的源代碼安裝了。源代碼安裝沒有rpm安裝的快捷。但比rpm靈活。如咱們自定義編譯參數,能夠最大化的貼近咱們想要的功能,性能好。並且咱們能看到源代碼,安裝的整個過程都很清楚,這就比rpm安全。源代碼安裝的程序通常都會放在同一個目錄中,這樣遷移也很方便,把所依賴的庫和程序移走就能夠。由於沒有rpm數據庫和安裝的固定路徑,因此能夠多版本並存。更有趣的是由於能夠自定義安裝位置,因此普通用戶也能夠安裝程序,如在本身的家目錄中。python


目錄:linux

1、簡介程序員

2、安裝
數據庫


環境:編程

系統:CentOS7.1vim

gcc: 4.8.3緩存


1、簡介安全

這裏主要說的是關於C代碼的編譯安裝,其實也說不了什麼東西,簡單的編譯安裝只有三步,而指定參數的部分,不一樣的軟件還都不同。這一部分主要是零散的一些東西。
bash

C代碼編譯安裝三步:架構

./configure
make
make install

這部分由於知識面的欠缺,實在是組織不起來,是一些上課的筆記和本身的理解。


標準的程序安裝要下面這麼多的步驟,不過咱們不用本身手動執行:

源代碼 --> 預處理 --> 編譯(gcc) --> 彙編 --> 連接 --> 執行


庫是一種功能的實現,調用它就能夠直接使用這個功能:

庫是可執行程序,但自己不能做爲程序執行入口,只能被調用。

wKioL1Z-S1OCLKrXAACB0SWplfg120.jpg

如這個圖片,程序只要調用API(在這裏就是庫),庫這個程序可能會發起系統調用也可能只是某一種簡單的功能,完畢之後把結果給程序,程序拿着結果再接着執行。 固然啦,有的程序也多是直接調用系統調用的,因此才畫了兩條直接到系統的線。


其中程序安裝過程當中的連接就是把庫和程序作關聯,而使程序真正的能夠工做起來。
靜態連接:把庫編譯到到程序中。
動態連接:dll, so(shared object)  。

linux上面在編譯程序的時候由ld程序在管理庫的查找和加載。在程序安裝完成之後,則須要ld-linux-x86-64.so.2來管理(CentOS7)。

若是把ld移走:

[root@localhost httpd-2.2.31]# ./configure
.....
configure: error: in `/root/httpd-2.2.31':
configure: error: C compiler cannot create executables
See `config.log' for more details
[root@localhost httpd-2.2.31]#


若是把ld-linux-x86-64.so.2移走:

[root@localhost ~]# fdisk
-bash: /usr/sbin/fdisk: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory
[root@localhost ~]# ls
-bash: /usr/bin/ls: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory
[root@localhost ~]# wc 
-bash: /usr/bin/wc: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory

這個可不要輕易嘗試,除了內嵌命令,都不能運行了。甚至都不能登陸了。玩大了,救援了j_0016.gif


API: Application Programing Interface   應用編程接口,也就是庫的調用接口。
ABI: Application Binary Interface  應用二進制接口,這個就屬於低層的運行方式。

API兼容,意味着開發庫兼容, 所以,源代碼可跨平臺

ABI兼容,編譯後的程序能夠跨平臺。


庫調用: 開發調用,運行調用。

開發調用(API),是根據頭文件來設置函數的各類參數,參數又是怎麼傳遞的。函數就是庫的接口。從而來調用庫的各類功能。

由於各個系統有通用的API接口,這也就實現了源代碼的跨平臺。固然有的程序不僅是隻調用API,也有可能調用系統調用。而這個的跨平臺取決於系統接口的一致性。如POSIX標準。


POSIX: 可移植操做系統接口(Portable Operating System Interface)

此標準用來定義操做系統的接口規範(系統調用接口),以實如今不一樣的操做系統上只要從新編譯程序就能夠運行。但如今只是實現了一部分的調用接口。因此有些代碼仍是不能直接跨平臺的。


以上都是在編譯以前的,若是是想在編譯以後的跨平臺,那就取決於ABI了。
運行調用(ABI),是直接調用庫的二進制程序。 不一樣的CPU架構,不一樣的操做系統,所組織 的二進制方式也不同。 ABI的不一樣。如如下:
一、 OS平臺:應用程序必須是特定OS平臺所支持的版本。由於二進制的組織格式不同。
二、 硬件平臺: 應用程序必須爲特定的CPU所支持。由於CPU彙編指令集的不一樣。
在這裏二進制根本就沒法展開運行。就算是CPU架構相同。系統的不一樣,也會致使二進制的執行格式不一樣,二進制的切入執行點都不對,固然沒法執行,動都沒法動,更別提調用庫了。其實我也不是很清楚,朋友就當看故事吧。

程序編譯會自動採用所在OS平臺的庫。 如 64的系統 64的庫。
源代碼翻譯成二進制程序,其實就是翻譯成了能夠被當前CPU指令集所可以執行的二進制程序。

amd 64bit 和 intel 64bits 的CPU架構是相同的。指令集也是相同的。 都是x86系列。

2、安裝

編譯C源代碼,前提是提供開發工具及開發環境

開發工具:gcc,make等。

開發環境:開發庫,頭文件。 如glibc標準庫。

簡單一點直接安裝開發包組:yum groupinstall "Development Tools"

開發工具介紹,是由程序員來完成的,咱們這裏的安裝用不到。

autoconf: 生成configure腳本
automake:生成Makefile.in模板。

建議:安裝前查看INSTALL,README


第一步:configure腳本
選項:指定安裝位置、指定啓用的特性
--help: 獲取其支持使用的選項
選項分類:
安裝路徑設定:
        --prefix=/PATH/TO/SOMEWHERE: 指定默認安裝位置;默認爲/usr/local/
        --sysconfdir=/PATH/TO/SOMEWHERE:配置文件安裝位置;

Optional Features: 可選特性
        --disable-FEATURE
        --enable-FEATURE[=ARG]

Optional Packages: 可選包
        --with-PACKAGE[=ARG]
        --without-PACKAGE

第二步:make
第三步:make install


安裝後的配置
(1) 導出二進制程序目錄至PATH環境變量中;
編輯文件/etc/profile.d/NAME.sh
export PATH=/PATH/TO/BIN:$PATH

(2) 導出庫文件路徑
編輯/etc/ld.so.conf.d/NAME.conf,添加新的庫文件所在目錄至此文件中;並讓系統從新生成緩存:ldconfig [-v]

(3) 導出頭文件
基於連接的方式實現: ln -sv 

(4) 導出幫助手冊
編輯/etc/man.config文件,添加一個MANPATH


安裝httpd2.2


[root@localhost httpd-2.2.31]# ./configure --prefix=/usr/local/httpd2.2 --sysconfdir=/etc/httpd/

[root@localhost httpd- 2.2 . 31 ]# make && make install
來看看安裝目錄下的文件。
[root@localhost httpd2. 2 ]# ls
bin  build  cgi-bin  error  htdocs  icons   include   lib  logs  man  manual  modules

這裏是咱們所指定的配置文件的位置。

[root@localhost httpd2. 2 ]# ll /etc/httpd
total  92
drwxr-xr-x.  2  root root   4096  Dec  27  02 : 28  extra
-rw-r--r--.  1  root root  13720  Dec  27  02 : 28  httpd.conf
-rw-r--r--.  1  root root  12958  Dec  27  02 : 28  magic
-rw-r--r--.  1  root root  53011  Dec  27  02 : 28  mime.types
drwxr-xr-x.  3  root root   4096  Dec  27  02 : 28  original
[root@localhost httpd2. 2 ]#

安裝後配置

一、PATH變量

由於咱們自定義安裝的位置沒有在PATH變量中,這樣咱們是不能直接執行所安裝的軟件的。由於咱們執行的命令除了內嵌和有別名的之外,都是bash查找PATH變量所指的路徑下全部文件的方式來執行的。

只要在/etc/profild.d/目錄下添加以.sh結尾的文件就能夠了。

[root@localhost bin]# pwd
/usr/local/httpd2. 2 /bin
[root@localhost bin]# httpd
-bash: httpd: command not found


[root@localhost bin]# vim /etc/profile.d/httpd2.2.sh

export PATH=/usr/local/httpd2. 2 /bin:$PATH
[root@localhost bin]# . /etc/profile.d/httpd2. 2 .sh
 
[root@localhost bin]# httpd
httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain  for  ServerName
[root@localhost bin]# echo $PATH
/usr/local/httpd2. 2 /bin:/usr/local/python27/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

上面咱們能夠看到,執行命令httpd是不起做用的,咱們編輯完/etc/profile.d/httpd2.2.sh之後而且讀入之後就能夠了。能夠看到如今的PATH變量中已經有軟件所在的路徑了。

二、導出庫文件的路徑

在linux上面全部編譯安裝的軟件,找庫的方式都是基於ld程序的。

若是是安裝在/lib[64]或者/usr/lib[64]下,那麼ld默認可以找到,若是安裝在其它的目錄,則須要將其添加到/etc/ld.so.cache文件中。

ld程序在每次開機的時候,都會由/etc/ld.so.conf和/etc/ld.so.conf.d/*.conf文件來生成ld.so.cache文件。 因此咱們手動添加路徑之後,要麼重啓主機,要麼就用ldconfig命令來重建ld.so.cache文件。


ldconfig使用:

-v 顯示過程。
-p 顯示當前的緩存路徑

[root@localhost httpd2. 2 ]# vim /etc/ld.so.conf.d/httpd2. 2 .conf
/usr/local/httpd2. 2 /lib
 
[root@localhost httpd- 2.2 . 31 ]# ldconfig -v | grep  '/usr/local/httpd2.2'
ldconfig: Can't stat /libx32: No such file or directory
ldconfig: Path `/usr/lib' given more than once
ldconfig: Path `/usr/lib64' given more than once
ldconfig: Can't stat /usr/libx32: No such file or directory
/usr/local/httpd2. 2 /lib:

我這裏報了一堆錯誤,不過管它。看到最下面的/usr/local/httpd2.2/lib了吧,已經成功了。能夠不加grep來看詳細的信息。

這些操做不是爲了所安裝的httpd要使用的,而是之後安裝其它的程序可能會被依賴

三、導出頭文件:
基於連接的方式實現: ln -sv

[root@localhost httpd2. 2 ]# ln -s /usr/local/httpd2. 2 / include / /usr/ include /httpd2. 2
[root@localhost httpd2. 2 ]# ll /usr/ include /httpd2. 2 / -d
drwxr-xr-x.  2  root root  4096  Dec  27  02 : 28  /usr/ include /httpd2. 2 /

這裏也不是爲了所安裝的httpd要使用的,而是之後安裝的其它程序可能會使用。

四、導出幫助手冊:

編輯/etc/man.config文件,添加一個MANPATH

呃,這裏說一下,咱們這個CentOS7.1好像自動識別了。不用再配置了,直接man httpd就成功了。

那麼這裏也不用說什麼,在CentOS6上面直接編輯/etc/man.config文件便可。


到這裏就已經安裝成功了。我這寫的比較雜,東西也比較亂。但都是一些但願之後能夠幫助到本身的東西,也但願能夠幫助到朋友們。



小話題:

若是在咱們編譯軟件的時候,終端實然斷了怎麼辦,按理論來講,在此終端下的程序都會結束。編譯了老半天,白忙活了。那麼能夠用screen程序。

screen 模擬多個虛擬窗口,而且隱藏之後能夠退出終端。
screen 打開新的screen虛擬界面
隱藏:Ctrl+a,d是在按住ctrl的狀況下,按一下a,再按一下d。
從新打開隱藏的 Screen: 顯示各screen ID:  screen -ls
從新打開:screen -r Screen_ID
只有一個模擬窗口,直接用screen -r就能夠打開。

Ctrl+a,d之後screen進程的父進程就會變成init。與本終端脫離父子關係。因此在終端結束之後編譯也不會中斷。
screen -r ID  打開之後,screen會在sshd-bash中開個新進程與父進程是init的screen通訊(本身瞎猜的)。


這個在編譯內核的時候經常使用到,而編譯軟件看狀況吧。

本文出自 「大蕃茄」 博客,請務必保留此出處http://fanqie.blog.51cto.com/9382669/1728628

相關文章
相關標籤/搜索