linux軟件包管理之三(源代碼安裝)

到達我們的源代碼安裝了。源代碼安裝沒有rpm安裝的快捷。但比rpm靈活。如我們自定義編譯參數,可以最大化的貼近我們想要的功能,性能好。而且我們能看到源代碼,安裝的整個過程都很清楚,這就比rpm安全。源代碼安裝的程序一般都會放在同一個目錄中,這樣遷移也很方便,把所依賴的庫和程序移走就可以。因爲沒有rpm數據庫和安裝的固定路徑,所以可以多版本並存。更有趣的是因爲可以自定義安裝位置,所以普通用戶也可以安裝程序,如在自己的家目錄中。再加一點,發行商爲了程序包的通用,一般都是在老點的機器上編譯。


目錄:

一、簡介

二、安裝


環境:

系統:CentOS7.1

gcc: 4.8.3


一、簡介

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

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

加個東西,今天上課的時候,老師說這兩個是庫的入口,具體是怎麼回事暫時先不搞它。

wKioL1aBHy7Qt08kAAHMnOeDVXE316.jpg


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

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

ABI兼容,編譯後的程序可以跨平臺。


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

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

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


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

此標準用來定義操作系統的接口規範(系統調用接口),以實現在不同的操作系統上只要重新編譯程序就可以運行。但現在只是實現了一部分的調用接口。所以有些代碼還是不能直接跨平臺的。


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

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

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


二、安裝

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

開發工具:gcc,make等。

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

簡單一點直接安裝開發包組:

開發工具:yum groupinstall "Development Tools"

服務器平臺開發:yum groupinstall “Server Platform Development”

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

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


C代碼編譯安裝的三步驟

./configure(1) 通過選項傳遞參數,指定啓用特性、安裝路徑等;執行時會參考用戶的指定以及Makefile.in文件生成makefile;(2) 檢查依賴到的外部環境;
make根據makefile文件,構建應用程序;
make install調用install命令複製各文件到指定目錄。

建議:安裝前查看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]#


安裝後配置

1、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變量中已經有軟件所在的路徑了。


2、導出庫文件的路徑

在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要使用的,而是以後安裝其它的程序可能會被依賴到。


3、導出頭文件:
基於鏈接的方式實現: 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要使用的,而是以後安裝的其它程序可能會使用。


4、導出幫助手冊:

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

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

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

centos7上面可以編輯/etc/man_db.conf 添加一條MANDATORY_MANPATH。 如:

wKioL1abmFSBREhmAABj_qKPlKk523.jpg

到這裏就已經安裝成功了。我這寫的比較雜,東西也比較亂。但都是一些希望以後可以幫助到自己的東西,也希望可以幫助到朋友們。




謝謝瀏覽,如果有什麼問題,大家一起討論討論。如果發現寫錯了,還請指出,謝謝。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章