软件编译安装

from 鸟哥Linux私房菜 第22章

一、gcc编译链接流程

gcc指令的一般格式为:Gcc [选项] 要编译的文件 [选项] [目标文件]

gcc编译的四个步骤为:预处理preprocessing、编译compiling、汇编assembling、链接linking

流程图为:

 

预处理preprocessing:处理include、宏展开、条件编译等。目标文件.i, 如gcc -E hello.c -o hello.i

编译compiling:将c/c++代码变成汇编代码。目标文件.s, 如gcc -S hello.i -o hello.s

汇编assembling:将汇编代码变成目标码。目标文件.o,如gcc -c hello.s -o hello.o

链接linking:链接一些函数库进来,将目标码变成最终可执行的机器码。gcc hello.o -o hello

参数意义:

  -o:后面接目标文件名。

  -E:只预处理,不做编译、汇编、链接

  -S:只编译,不做汇编、链接

  -c:编译和汇编,不做链接

       -O -Wall:优化和警告

简单来说,不带任何参数使用gcc hello.c -o hello一步到位。如果需要中间产生目标码,则gcc -c hello.c -o hello.o

关于静态/动态函数库:

  静态函数库(.a, .lib):在编译时直接全部整合到了执行程序中,文件会大一些,执行时独立执行,升级难易度大(函数库升级时需要重新编译)

  动态函数库(.so, .dll):在编译时获取一个指针,文件小,不能独立执行(函数库必须要能被找到),升级难易度小

 

二、完整的软件安装过程

1. 从特定网页下载源码并解压,如

  wget http://linux.vbird.org/linux_basic/0520source/ntp-4.2.4p7.tar.gz;

  mv ntp-4.2.4p7.tar.gz /usr/local/src && cd /usr/local/src 建议放在/usr/local/src下!

  tar -zxvf ntp-4.2.4p7.tar.gz

2. 取得步骤流程,查阅INSTALL和README

3. 相关属性软件安装,根据INSTALL和README的内容确定是否有提前需要安装的软件(如gcc)

4.configure

  configure一般是软件开发者写的一个可以检测系统相关软件属性的shell script。./configure成功后即可自动生成Makefile

  ./configure --prefix=/usr/local/ntp --enable… prefix设置安装路径!(默认是/usr/local)

5. make clean && make && make check

6. make install (前面必须成功才能正确安装)

7.patch安装更新

  patch -p# < path/to/patch

 

三、如何写Makefile

# 1. 先進行目標檔的編譯,最終會有四個 *.o 的檔名出現:
[root@study ~]# gcc -c main.c
[root@study ~]# gcc -c haha.c
[root@study ~]# gcc -c sin_value.c
[root@study ~]# gcc -c cos_value.c

# 2. 再進行連結成為執行檔,並加入 libm 的數學函式,以產生 main 執行檔:
[root@study ~]# gcc -o main main.o haha.o sin_value.o cos_value.o -lm

# 3. 本程式的執行結果,必須輸入姓名、360 度角的角度值來計算:
[root@study ~]# ./main 
Please input your name: VBird  <==這裡先輸入名字
Please enter the degree angle (ex> 90): 30   <==輸入以 360 度角為主的角度
Hi, Dear VBird, nice to meet you.    <==這三行為輸出的結果喔!
The Sin is:  0.50
The Cos is:  0.87
View Code
# 1. 先編輯 makefile 這個規則檔,內容只要作出 main 這個執行檔
[root@study ~]# vim makefile
main: main.o haha.o sin_value.o cos_value.o
    gcc -o main main.o haha.o sin_value.o cos_value.o -lm
# 注意:第二行的 gcc 之前是 <tab> 按鍵產生的空格喔!

# 2. 嘗試使用 makefile 制訂的規則進行編譯的行為:
[root@study ~]# rm -f main *.o   <==先將之前的目標檔去除
[root@study ~]# make
cc    -c -o main.o main.c
cc    -c -o haha.o haha.c
cc    -c -o sin_value.o sin_value.c
cc    -c -o cos_value.o cos_value.c
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
# 此時 make 會去讀取 makefile 的內容,並根據內容直接去給他編譯相關的檔案囉!

# 3. 在不刪除任何檔案的情況下,重新執行一次編譯的動作:
[root@study ~]# make
make: `main' is up to date.
# 看到了吧!是否很方便呢!只會進行更新 (update) 的動作而已。
View Code
# 1. 先編輯 makefile 來建立新的規則,此規則的標的名稱為 clean :
[root@study ~]# vi makefile
main: main.o haha.o sin_value.o cos_value.o
    gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean:
    rm -f main main.o haha.o sin_value.o cos_value.o

# 2. 以新的標的 (clean) 測試看看執行 make 的結果:
[root@study ~]# make clean  <==就是這裡!透過 make 以 clean 為標的
rm -rf main main.o haha.o sin_value.o cos_value.o
View Code
[root@study ~]# vi makefile
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: ${OBJS}
        gcc -o main ${OBJS} ${LIBS}
clean:
        rm -f main ${OBJS}
View Code
[root@study ~]# vi makefile
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall
main: ${OBJS}
    gcc -o main ${OBJS} ${LIBS}
clean:
    rm -f main ${OBJS}
View Code

 makefile总结:

  变量最好是大写字母,${变量}使用

  tab位置

 

posted @ 2018-05-15 12:47  通通的蓝图  阅读(555)  评论(0编辑  收藏  举报