Linux學習筆記(八)-基於AIX/Linux平臺的項目開發

基於AIX/Linux平臺的項目開發

一. gcc編譯工具
1 . gcc基本介紹
- gcc,全稱GNU Compiler Collection,是一套GNU開發的編譯器環境,它的創始人是Richard.M.Stallman
- gcc不僅可以支持C語言,還可以處理C++,Pascal,Object-C,Java以及Ada等其他語言
- gcc是Linux 的基石,操作系統內核和大部分程序都是gcc 編譯的,是Linux下最重要開發工具之一
- 而cc通常是指向gcc的一個鏈接
2 . 利用gcc的例子
例子1:想得到現在正在使用的gcc的版本號

$ gcc -v
Reading specs from /usr/lib/gcc-lib/i486-box-Linux/2.7.2/specs
gcc version 2.7.2

例子2:gcc構造應用程序

hello.c 示例代碼:
#include <stdio.h>
int main(void)
{
printf("Hello, world!\n");
return 0;
}


//要用 gcc 編譯該文件,使用下面的命令:
$ gcc -Wall hello.c -o hello
//該命令將文件‘hello.c’中的代碼編譯爲機器碼並存儲在可執行文件 ‘hello’中。
//本例中,編譯器使用了 -Wall 選項而沒產生任何警告,因爲示例程序是完全合法的。
//機器碼的文件名是通過 -o 選項指定的。該選項通常作爲命令行中的最後一個參數
//注意到如果當前目錄中與可執行文件重名的文件已經存在,它將被覆蓋
//選項 -Wall 開啓編譯器幾乎所有常用的警告──強烈建議始終使用該選項。當編寫 C 或 C++ 程序時編譯器警告非常有助於檢測程序存在的問題

例子3:多個源文件的編譯

下面的例子中我們將程序 Hello World 分割成 3 個文件:‘main.c’,‘hello_fn.c’和頭文件‘hello.h’

//這是主程序‘main.c’:
#include "hello.h"
int main(void)
{
hello ("world");
return 0;
}

//文件‘hello.h’中的聲明只用了一行就指定了函數 hello 的原型。
void hello (const char * name);


//函數 hello 的定義在文件‘hello_fn.c’中:
#include <stdio.h>
#include "hello.h"
void hello (const char * name)
{
  printf ("Hello, %s!\n", name);
}


//要用gcc編譯以上源文件,使用下面的命令
$ gcc -Wall main.c hello_fn.c -o newhello
//本例中,我們使用選項 -o 爲可執行文件指定了一個不同的名字 newhello
//注意到頭文件‘hello.h’並未在命令行中指定。源文件中#include "hello.h" 指示符使得編譯器自動將其包含到合適的位置

//要運行本程序,輸入可執行文件的路徑名
$ ./newhello
Hello, world!
//源程序各部分被編譯爲單一的可執行文件,它與我們先前的例子產生的結果相同

在編譯一個包含許多源文件的工程時,若只用一條gcc命令來完成編譯是非常浪費時間的。假設項目中有100個源文件需要編譯,如果像上面那樣僅用一條gcc命令來完成編譯工作,那麼gcc需要將每個源文件都重新編譯一遍,然後再全部連接起來。很顯然,這樣浪費的時間相當多,尤其是當用戶只是修改了其中某一個文件的時候,完全沒有必要將每個文件都重新編譯一遍,因爲很多已經生成的目標文件是不會改變的。要解決這個問題,關鍵是要靈活運用gcc,同時還要藉助像Make這樣的工具

二. Makefile的編寫
1. 介紹
- 什麼是makefile?或許很多Winodws的程序員都不知道這個東西,因爲那些Windows的IDE都爲你做了這個工作
- Makefile定義了整個工程的編譯規則。makefile指定了哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至於進行更復雜的功能操作,因爲makefile就像一個Shell腳本一樣,其中也可以執行操作系統的命令
2 . Makefile的規則

target ... : prerequisites ... 
    command 
- 這是一個文件的依賴關係,也就是說,target這一個或多個的目標文件依賴於prerequisites中的文件,其生成規則定義在command中
- prerequisites中如果有一個以上的文件比target文件要新的話,command所定義的命令就會被執行。這就是Makefile的規則。也就是Makefile中最核心的內容
- 在定義好依賴關係後,後續的那一行定義瞭如何生成目標文件的操作系統命令,一定要以一個Tab鍵作爲開頭。
- make會比較targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的話,那麼,make就會執行後續定義的命令

編寫hello程序的makefile

 newhello : main.o hello_fn.o
        gcc -o  newhello main.o hello_fn.o

 main.o : main.c  hello.h
        gcc -c main.c

 hello_fn.o : hello_fn.c hello.h
        gcc -c hello_fn.c

 clean :
        rm  newhello  main.o hello_fn.o
 install:
        cp newhello /usr/local/bin

Make命令:在默認的方式下,也就是隻輸入make命令

1、make會在當前目錄下找名字叫“Makefile”或“makefile”的文件。
2、如果找到,它會找文件中的第一個目標文件(target),在上面的例子中,會找到“newhello ”這個文件,並把這個文件作爲最終的目標文件。
3、如果newhello文件不存在,或是newhello所依賴的後面的 .o 文件的文件修改時間要比newhello這個文件新。那麼就會執行後面所定義的命令來生成newhello這個文件。
4、如果newhello所依賴的.o文件也存在,那麼make會在當前文件中找目標爲.o文件的依賴性,如果找到則再根據那一個規則生成.o文件。
5、這個過程有點像堆棧,最後的目標是生成執行文件newhello。

三. RPM包的創建
1. 創建RPM
- 要想製作一個rpm軟件包就必須額外再寫一個軟件包描述文件(SPEC)
- spec文件中包含了軟件包的諸多信息:

-如軟件包的名字、版本、類別、說明摘要
-創建時要執行什麼指令
-安裝時要執行什麼操作
-以及軟件包所要包含的文件列表等等。

2 .例子:hello的構建
這裏寫圖片描述

1. 在/usr/src/redhat/SOURCES下新建一個hello-1.0目錄,vi 左邊這三個文件到裏面;

2. #tar -zcvf  hello-1.0.tar.gz  hello-1.0

3. 設置路徑變量
 #RPM_BUILD_DIR=/usr/src/redhat/BUILD
#RPM_SOURCE_DIR=/usr/src/redhat/SOURCES

4. 在/usr/src/redhat/SPECS下vi 一個hello.spec,具體內容如下頁所示;

這裏寫圖片描述

其中%description:軟件包詳細說明,可寫在多個行上
這裏寫圖片描述

  • 預處理段%prep通常用來執行一些解開源程序包的命令,爲下一步的編譯安裝作準備。
  • %prep和下面的%build,%install段一樣,除了可以執行RPM所定義的宏命令(以%開頭)以外,還可以執行SHELL命令,命令可以有很多行,如我們常寫的tar解包命令
//RPM 構建過程
#rpmbuild –ba ./hello.spec
…..
…..
Wrote:/usr/src/redhat/SRPMS/hello-1.0_Share.src.rpm
Wrote:/usr/src/redhat/RPMS/I386/hello-1.0-Share.i386.rpm

Source RPM located in
   /usr/src/{redhat|packages}/SRPMS
Binary RPM located in
   /usr/src/{redhat|packages}/RPMS/<arch>
Can use binary RPM as any RPM:

//RPM 構造過程結束後
#cd /usr/src/redhat/SRPMS
#ls 
Hello-1.0-Share.src.rpm
#rpm-ivh hello-1.0-Share.src.rpm
#hello
Hello,world!
#whereis hello
Hello:/usr/bin/hello
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章