GCC含義、分步驟編譯以及鏈接過程、Makefile寫法

一、GCC含義

最初含義爲:GNU C Complier(在linux c編譯器)

後來發展爲:GNU Complier Collection(在linux下除c以外,還能編譯c++,objectc等其他語言)

 

二、分步驟編譯以及鏈接過程

假定存在如下文件列表

user.h

user.cpp

main.cpp 


a). user.h:

 

b). user.cpp

 

c). main.cpp

 

以下操作是在windows上完成(安裝了MINWG環境)

 

1. 單獨編譯每一個文件,包括main.cpp,爲每一個cpp文件生成o文件

a). gcc -o user.o -c user.cpp

gcc -o main.o -c main.cpp

如下圖:

 

b). 鏈接o文件成可執行文件,使用-l參數添加要使用的類庫。由於在user.cpp中使用了 std::cout

gcc -o main user.o main.o -lstdc++

如下圖:

 

其中生成的可執行文件爲main.exe 可以指定任意你想要的名字,如:

 

注:windows下生成的可執行文件帶有擴展名.exe,linux下不帶擴展名(linux下該場景下生成的可執行文件爲 main 或 custom_define)

 

c). 執行,查看結果

在當前目錄下執行

./main.exe 或

./custom_define.exe

如下圖:

注:linux下,該場景按如下執行:

./main

./custom_define

 

三、使用Makefile完成上述過程

對於少量文件,每次單個文件編譯和鏈接還能接受,當源文件過多時,使用Makefile會很便捷。

 

a). 編寫Makefile文件

如下圖:

 

如果需要引用頭文件和庫文件

1、在Makefile文件的開頭加入如下定義

MY_INC=-I /include路徑

MY_LIB=-L/so文件路徑 -lso文件名稱


eg:

MY_INC==-I /usr/local/include/ImageMagick

MY_LIB=-L/usr/local/mysql/lib64 -lmysqlclient


2、在編譯c文件的時候加入 inc變量

eg: 


gcc -c usr.cpp -o user.o $(MY_INC)


3、在連接o文件生成可執行文件時,加入lib變量

gcc -o main \

    user.o \

    main.o -lstdc++ $(MY_LIB)


b). 將Makefile文件與源代碼放到同目錄下,默認執行make,來編譯和鏈接生成可執行文件

如下圖:

 

注:由於連接完成後刪除了所有 .o文件,所以最後一個ls查看命令後,除了源文件和Makefile文件外,只有生成的可執行文件

 

c). 執行清除命令 make clean

如下圖:

 

d). 執行make all 命令,清除後再執行編譯連接(因爲Makefile源文件中,all命令是分別執行 clean 和 test兩步操作)

如下圖:

 

e)由於Makefile中對編譯和鏈接操作起的名字爲 test(見Makefile源文件)

所以對於編譯和鏈接生成可執行文件的過程,也可以通過執行 make test來完成

如下圖:

 

這只是一個名字而已,可以任意起,比如abc也行。

如下圖:

 

甚至clean和all都可以換成其他名字(比如將clean 換成cleans;all換成doall等任意名字)

 

在執行時,命令分別變成:

a). make

b). make abc

c). make cleans

d). make doall

大家自己可以嘗試一下。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章