- 配置終端的C開發環境
在Ubuntu 終端系統中開發,需要依賴一些命令行工具,對比使用windows 下的IDE集成開發環境會有一些不同之處。
在linux 下一般使用gcc 編譯C 語言代碼,gcc 可以通過管理工具進行安裝,以Ubuntu 16.04為例
sudo apt-get install gcc
新建一個C 語言程序進行編譯演練,可以使用vim, 或者是touch命令來創建一個文件。
vim test.c / touch test.c
#include <stdio.h>
int main( )
{
printf("study gccn");
return 0;
}
代碼編輯完成后,使用gcc 命令進行編譯
$ ls
test.c
$ gcc -o test test.c
-o 參數指定可執行程序名,test.c 是源碼文件,當編譯完成后,當前目錄下會出現一個可執行文件test
$ ls
test test.c
在命令行下,將可執行程序運行起來,看是否會輸出預期的內容:
$ ./test
study gcc
- 多文件編譯
一般程序都是由多個文件組成,編譯多個文件程序,需要將所有源碼文件傳給編譯器。
以C語言為例,將test.c 拆解成兩個文件,創建test2.c
touch test2.c
#include <strdio.h>
void print_test( )
{
printf("study gccn");
}
test2.c 中定義一個函數,函數名為print_test, 用于輸出 "study gcc".
在test.c中直接調用print_test 即可:
test.c
void print_test( );
int main( )
{
print_test();
return 0;
}
按照以下步驟,編譯由兩個文件組成的程序:
gcc -o test test.c test2.c
- 解析編譯流程
程序編譯可以進一步分成為編譯(Compile) 和鏈接(Link) 這兩個階段
我們可以分階段編譯test.c, test2.c,源文件如下:
$ ls
test.c test2.c
編譯test2.c文件, 生成test2.o 對象文件:
$ gcc -c test2.c
$ ls
test2.c test2.o test.c
編譯test.c文件,生成test.o 對象文件:
$ gcc -c test.c
$ ls
test2.c test2.o test.c test.o
最后鏈接兩個對象文件,生成可執行程序:
$ gcc -o test test.o test2.o
$ ./test
stduy gcc
- 關于分階段編譯
分階段編譯的最大好處是, 可以進行部分編譯 ==> 只是編譯有變更的部分
在上面的例子中,test.c 有變更,而test2.c 沒有變更,那么,我們只需要編譯test.c 生成新的test.o 對象文件,最后再跟test2.o 文件鏈接生成新的可執行文件test。
可以省去編譯test2.c 這段時間,如果文件較多,節省的編譯時間就會很長。
- 使用Makefile 自動編譯
touch Makefile
.DEFAULT_GOAL := run
test2.o: test2.c
gcc -o test2.o -c test2.c
test.o: test.c
gcc -o test.o -c test.c
test: test2.o test.o
gcc -o test test2.o test.o
run: test
./test
clean:
rm -f *.o
rm -f test
$ ls
Makefile test2.c test.c
$ make
gcc -o test2.o -c test2.c
gcc -o test.o -c test.c
gcc -o test test2.o test.o
./test
stduy gcc
執行make 命令
$ ls
Makefile test2.c test.c
$ make
gcc -o test2.o -c test2.c
gcc -o test.o -c test.c
gcc -o test test2.o test.o
./test
stduy gcc
Makefile 大致可以理解成 目標 、 依賴 以及 構建指令 。
缺省情況下,Makefile定義的第一個目標為默認目標,在第一行顯式定義了默認目標,由于沒有變更,再次構建時自動省略編譯環節。
$ make
./test
study gcc
定義用于清理編譯結果的目標 ==》 clean:
$ ls
Makefile test test2.c test2.o test.c test.o
$ make clean
rm -f *.o
rm -f test
$ ls
Makefile test2.c test.c
清理編譯結果,在進行全新編譯時很方便。