1. 程式人生 > >Linux下的原始碼包編譯和安裝原理

Linux下的原始碼包編譯和安裝原理

一、Linux原始碼包安裝過程

用於linux原始碼安裝軟體,一般下載原始碼包得到檔案:file.tar.gz和file.tar.bz2格式
(1)解壓縮

解壓命令為:  tar jxvf file.tar.bz2
  tar zxvf file.tar.gz
(2)配置檔案

  cd .../file

  ./configure    ......

(3)編譯檔案

make

(4)安裝文

  make install
(5)刪除一些臨時檔案
 make clean
make clean:清除編譯產生的可執行檔案及目標檔案(object file,*.o)
make distclean:除了清除可執行檔案和目標檔案外,把configure所產生的Makefile也清除掉

make dist:將程式和相關的檔案包裝成一個壓縮檔案以供釋出。執行完在目錄下會產生一個以PACKAGE-VERSION.tar.gz為名稱的檔案。 PACKAGE和VERSION這兩個變數是根據configure.in檔案中AM_INIT_AUTOMAKE(PACKAGE,VERSION)的定義。在此範例中會產生test-1.0.tar.gz的檔案。

make distcheck:和make dist類似,但是加入檢查包裝後的壓縮檔案是否正常。這個目標除了把程式和相關檔案包裝成tar.gz檔案外,還會自動把這個壓縮檔案解開,執行 configure,並且進行make all 的動作,確認編譯無誤後,會顯示這個tar.gz檔案可供釋出了。這個檢查非常有用,檢查過關的包,基本上可以給任何一個具備GNU開發環境-的人去重新編譯

(5)解除安裝檔案
  make uninstall

二、編譯和執行一個簡單的main.c檔案

編譯和執行一個簡單的c語言原始檔main.c,需要自動生成一個makefile,

以下是步驟:

第一步:

建立一個檔案main.c在一定的目錄/home/hufeihu/project/main下面:

------------------------------------------------

在main.c檔案中寫入一下的語句

#include <stdio.h>

int main(int argc, char** argv)

{

    printf("Hello, Auto Makefile!\n");

    return 0;

}

------------------------------------------------

此時狀態如下:

[email protected]:/home/hufeihu/project/main# pwd /home/hufeihu/project/[email protected]:/home/hufeihu/project/main# ls main.c [email protected]:/home/hufeihu/project/main#

第二步:

----------

執行autoscan, 自動建立兩個檔案: autoscan.log configure.scan

此時狀態如下:

[email protected]:/home/hufeihu/project/main# autoscan

[email protected]:/home/hufeihu/project/main# ls autoscan.log  configure.scan  main.c

[email protected]:/home/hufeihu/project/main#

第三步:

----------

修改configure.scan的檔名為configure.in


檢視configure.in的內容:


------------------------------------------------

# -*-Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([main.c])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT

------------------------------------------------

解讀以上的檔案:

------------------------------------------------

#                                               -*- Autoconf -*-

# Process this file with autoconf to produce a configure script.

# AC_PREREQ:

# 確保使用的是足夠新的Autoconf版本。如果用於建立configure的Autoconf的版

# 本比version 要早,就在標準錯誤輸出列印一條錯誤訊息並不會建立configure。

AC_PREREQ(2.69)

#

# 初始化,定義軟體的基本資訊,包括設定包的全稱,版本號以及報告BUG時需要用的郵箱地址

#

AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)

#

# 用來偵測所指定的原始碼檔案是否存在,來確定原始碼目錄的有效性

#

AC_CONFIG_SRCDIR([main.c])

#

# 用於生成config.h檔案,以便autoheader使用

#

AC_CONFIG_HEADER([config.h])

# Checks for programs.

AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

#

# 建立輸出檔案。在`configure.in'的末尾呼叫本巨集一次。

#

AC_OUTPUT

------------------------------------------------

修改動作:

    1.修改AC_INIT裡面的引數: AC_INIT(main,1.0, hufeihu@163.com)

    2.新增巨集AM_INIT_AUTOMAKE, 它是automake所必備的巨集,也同前面一樣,PACKAGE是所要產生軟體套件的名稱,VERSION是版本編號。

    3.在AC_OUTPUT後新增輸出檔案Makefile

修改後的結果:


------------------------------------------------

#                                               -*- Autoconf -*-

# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.61)

AC_INIT(main, 1.0, hufeihu@163.com)

AC_CONFIG_SRCDIR([main.c])

AC_CONFIG_HEADER([config.h])

AM_INIT_AUTOMAKE(main,1.0)

# Checks for programs.

AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT([Makefile])

------------------------------------------------

第四步:

執行aclocal, 生成一個“aclocal.m4”檔案和一個緩衝資料夾autom4te.cache,該檔案主要處理本地的巨集定義。

此時的狀態是:

[email protected]:/home/hufeihu/project/main# aclocal
aclocal: warning: autoconf input should be named 'configure.ac', not 'configure.in'
[email protected]:/home/hufeihu/project/main# ls
aclocal.m4  autom4te.cache  autoscan.log  configure.in  main.c
[email protected]:/home/hufeihu/project/main#

第五步:

執行autoconf, 目的是生成 configure

此時的狀態是:

[email protected]:/home/hufeihu/project/main# autoconf
[email protected]:/home/hufeihu/project/main# ls
aclocal.m4  autom4te.cache  autoscan.log  configure  configure.in  main.c
[email protected]:/home/hufeihu/project/main#

第六步:

執行autoheader,它負責生成config.h.in檔案。該工具通常會從“acconfig.h”檔案中複製使用者附加的符號定義,因此此處沒有附加符號定義,所以不需要建立“acconfig.h”檔案。

此時的狀態是:

[email protected]:/home/hufeihu/project/main#  autoheader
[email protected]:/home/hufeihu/project/main# ls
aclocal.m4      autoscan.log  configure     main.c
autom4te.cache  config.h.in   configure.in
[email protected]:/home/hufeihu/project/main#

第七步:

下面即將執行automake, 但在此之前應該做一下準備工作!

首先

建立一個Makefile.am.這一步是建立Makefile很重要的一步,automake要用的指令碼配置檔案是Makefile.am,使用者需要自己建立相應的檔案。之後,automake工具轉換成Makefile.in。

這個Makefile.am的內容如下:


------------------------------------------------

AUTOMAKE_OPTIONS=foreign

bin_PROGRAMS=main

main_SOURCES=main.c

------------------------------------------------

下面對該指令碼檔案的對應項進行解釋。

    其中的AUTOMAKE_OPTIONS為設定automake的選項。由於GNU(在第1章中已經有所介紹)對自己釋出的軟體有嚴格的規範,比如必須附 帶許可證宣告檔案COPYING等,否則automake執行時會報錯。automake提供了三種軟體等級:foreign、gnu和gnits,讓用 戶選擇採用,預設等級為gnu。在本例使用foreign等級,它只檢測必須的檔案。

    bin_PROGRAMS定義要產生的執行檔名。如果要產生多個執行檔案,每個檔名用空格隔開。

    main_SOURCES定義“main”這個執行程式所需要的原始檔案。如果”main”這個程式是由多個原始檔案所產生的,則必須把它所用到的所有原 始檔案都列出來,並用空格隔開。例如:若目標體“main”需要“main.c”、“sunq.c”、“main.h”三個依賴檔案,則定義 main_SOURCES=main.c sunq.c main.h。要注意的是,如果要定義多個執行檔案,則對每個執行程式都要定義相應的file_SOURCES。

其次

使用automake對其生成“configure.in”檔案,在這裡使用選項“—adding-missing”可以讓automake自動新增有一些必需的指令碼檔案。

執行後的狀態是:

------------------------------------------------

[email protected]:/home/hufeihu/project/main# automake --add-missing

configure.in:8: installing `./missing'

configure.in:8: installing `./install-sh'

Makefile.am: installing `./depcomp'

[email protected]:/home/hufeihu/project/main#ls

aclocal.m4      config.h.in   configure.in~ main.c        Makefile.in

autom4te.cache configure    depcomp        Makefile.am missing

autoscan.log    configure.ininstall-sh     Makefile.am~

[email protected]:/home/hufeihu/project/main#

------------------------------------------------

第八步

執行configure,在這一步中,通過執行自動配置設定檔案configure,把Makefile.in變成了最終的Makefile。

執行的結果如下:


------------------------------------------------

[email protected]:/home/hufeihu/project/main# ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking whether gcc understands -c and -o together... yes
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: executing depfiles commands
[email protected]:/home/hufeihu/project/main#

[email protected]:/home/hufeihu/project/main# ls

aclocal.m4      config.h.in    configure.in   main.c        Makefile.in

autom4te.cache config.log     configure.in~ Makefile     missing

autoscan.log    config.statusdepcomp        Makefile.am  stamp-h1

config.h        configure     install-sh     Makefile.am~

[email protected]:/home/hufeihu/project/main#

------------------------------------------------

第九步

執行make,對配置檔案Makefile進行測試一下

此時的狀態如下:


------------------------------------------------

[email protected]:/home/hufeihu/project/main# make
make  all-am
make[1]: Entering directory '/home/hufeihu/project/main'
gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
mv -f .deps/main.Tpo .deps/main.Po
gcc  -g -O2   -o main main.o  
make[1]: Leaving directory '/home/hufeihu/project/main'
[email protected]:/home/hufeihu/project/main#

[email protected]:/home/hufeihu/project/main# ls

aclocal.m4      autoscan.log config.h.in config.status configure.in   depcomp    main    main.o    Makefile.am   Makefile.in stamp-h1

autom4te.cache config.h      config.log   configure      configure.in~ install-sh main.c Makefile Makefile.am~ missing

[[email protected] main]#

------------------------------------------------

第十步

執行生成的檔案 main:

------------------------------------------------

[email protected]:/home/hufeihu/project/main# ./main

Hello, Auto Makefile!


總結一下,使用automake自動生成makefile的過程主要有

1、建立好原始檔以後到原始檔所在目錄 2、autoscan命令 將configure.scan檔案修改為configure.in           修改configure.in檔案中的內容:                AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)修改為AC_INIT(main, 1.0,         在AC_CONFIG_HEADER([config.h])後面新增AM_INIT_AUTOMAKE(main,1.0)              在最後新增AC_OUTPUT([Makefile]) 3、執行aclocal 4、執行autoconf 5、執行autoheader 6、建立Makefile.am檔案,內容為 AUTOMAKE_OPTIONS=foreign

     bin_PROGRAMS=main 如果有多個用空格分開

     main_SOURCES=main.c 定義main所需原始檔,多個可執行檔案分別定義 7、執行automake --add-missing 8、執行./configure 9、執行make 在第六步中需要自己寫Makefile.am檔案,特別是其中的main_SOURCES需要把生成main所以來的檔案都包含進來。並且那些間接依賴的檔案也需要包含進來。比如說我有三個檔案:main.cpp Add.cpp Add.h  Num.h Num.cpp其中在main.cpp中包含了Add.h  在Add.cpp中包含了Num.h這樣在完成main的依賴檔案時就需要包含以上所有的問個檔案main.cpp Add.cpp Add.h  Num.h Num.cpp才可以。