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
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
# 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
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
# 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) 的動作而已。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
# 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
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
[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}
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
[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}
makefile总结:
变量最好是大写字母,${变量}使用
tab位置