到達咱們的源代碼安裝了。源代碼安裝沒有rpm安裝的快捷。但比rpm靈活。如咱們自定義編譯參數,能夠最大化的貼近咱們想要的功能,性能好。並且咱們能看到源代碼,安裝的整個過程都很清楚,這就比rpm安全。源代碼安裝的程序通常都會放在同一個目錄中,這樣遷移也很方便,把所依賴的庫和程序移走就能夠。由於沒有rpm數據庫和安裝的固定路徑,因此能夠多版本並存。更有趣的是由於能夠自定義安裝位置,因此普通用戶也能夠安裝程序,如在本身的家目錄中。python
目錄:linux
1、簡介程序員
2、安裝
數據庫
環境:編程
系統:CentOS7.1vim
gcc: 4.8.3緩存
1、簡介安全
這裏主要說的是關於C代碼的編譯安裝,其實也說不了什麼東西,簡單的編譯安裝只有三步,而指定參數的部分,不一樣的軟件還都不同。這一部分主要是零散的一些東西。
bash
C代碼編譯安裝三步:架構
./configure make make install
這部分由於知識面的欠缺,實在是組織不起來,是一些上課的筆記和本身的理解。
標準的程序安裝要下面這麼多的步驟,不過咱們不用本身手動執行:
源代碼 --> 預處理 --> 編譯(gcc) --> 彙編 --> 連接 --> 執行
庫是一種功能的實現,調用它就能夠直接使用這個功能:
庫是可執行程序,但自己不能做爲程序執行入口,只能被調用。
如這個圖片,程序只要調用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
這個可不要輕易嘗試,除了內嵌命令,都不能運行了。甚至都不能登陸了。玩大了,救援了。
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