轉自 :https://www.cnblogs.com/repository/archive/2011/05/18/2050546.html
1. 准備工作:
程序:
MinGW-3.1.0-1.exe windows下的gcc,編譯c語言的工具
下載地址: http://umn.dl.sourceforge.net/sourceforge/mingw/MinGW-3.1.0-1.exe
make 按照makefile規則編譯程序的工具
位置 :window/system32下,如果沒有可以在 http://www.mingw.org/download.shtml找到
配置環境:
環境變量配置 :
控制面板> 系 統 >高級 >環境變量 >系統變量 >添加MinGW 安裝目錄下的bin目錄到path中去,或者命令行下運行:set PATH= MinGW 安裝目錄下的bin目錄
把C:\WINDOWS\system32用上邊方法添加到path中以找到make.exe
創建四個文件:
//---------------------------Main.c : ---------------------------// #include "stdio.h" main() { func(); printf("this is main\n"); getch(); }
//---------------------------func.c : ---------------------------// #include "stdio.h" func() { printf("this is func\n"); getch(); }
一個空文件,文件名為makefile或者Makefile,這個文件名是必須的因為make默認查找該文件
創建compile.bat文件
內容為:
make
cmd
2. 編寫makefile
示例:
test:main.o func.o
gcc -o test main.o func.o
func.o:func.c
gcc -c func.c
main.o:main.c
gcc -c main.c
1行:生成test可執行文件,它的依賴於main.o func.o,也就是說生成test你得先生成它們,
2行:gcc前邊必須是tab也就是7個空格,表示編譯生成test
后邊是依賴項的生成規則
然后運行compile.bat就可以生成test.exe文件了,同時會附加生成func.o和main,o兩個中間代碼的文件,類似於VC中的obj文件
- 3. makefile的編寫規則
可以參看:http://www.stlchina.org/twiki/bin/view.pl/ScriptProgram/LearnMakefile
- 4. gcc的參數
同VC,TC等編譯器不同,GCC其實是可以很方便的在提示符下編譯程序的。GCC在提示符下編譯程序,並沒有如同VC那樣的冗長而晦澀的編譯參數。相反,卻有着比VC更靈活且簡短的參數。
不得不承認,不懂GCC編譯參數的人,確實會損失一些GCC的強大功能。所以,我下面簡單介紹一下GCC的一些基本編譯參數。這里,我以C編譯器為例。
編譯二進制代碼
$gcc -c yours.c -o yours.o |
使用這段指令,GCC將會把yours.c編譯成yours.o的二進制代碼。其中,yours.o就類似於VC,TC中的.obj文檔。
編譯最簡單的小程序。
$gcc -o yours yours.c |
通過這條指令,GCC將會把yours.c源代碼編譯成名為yours的可執行程序。當然,您也可以將yours.c改成我們剛才介紹的yours.o文件。這樣,gcc將使用編譯剛才編譯好的二進制文檔來鏈接程序。這里,格式的特點是,-o 后面是一串文件列表,第一個參數是所編譯程序的文件名,從第二個開始,就是您編譯和連接該可執行程序所需要的二進制文檔或者源代碼。
編譯時將自己的頭文件目錄設為默認頭文件目錄
$gcc -I”Your_Include_Files_Document_Path” -c yours.c -o yours.o |
這條指令中的-I參數將會把Your_Include_Files_Document_Path添加到你默認的頭文件目錄中。這樣您將可以使用 #include <your_include.h>來導入頭文件。
編譯時使用自己的靜態庫存放目錄
$gcc -L”Your_Lib_Files_Document_Path” -o yours yours.o |
這條指令將會讓GCC在連接時除了在默認Lib存放目錄中搜索指定的靜態庫以外,還會在Your_Lib_Files_Document_Path中搜索。
編譯時使用靜態連接庫
$gcc -lyour_lib -o yours yours.o |
這條指令將會讓GCC在連接時把 libyour_lib.a中您所用到的函數連接到可執行程序中。此處注意,GCC所使用的靜態連接庫是lib*.a格式的。在連接時,只且僅需要提供*的內容就可以了。
編譯時使用優化
$gcc -O2 -c yours.c -o yours.o |
使用優化方式編譯程序,其中除了-O2以外,還有-O3 -O1等等。他們代表不同的優化等級。最常用的,是-O2優化。當然,還有針對特殊CPU的優化,這里就不介紹了。
編譯時顯示所有錯誤和警告信息
$gcc -Wall -c yours.c -o yours.o |
GCC在默認情況下,將對一些如變量申請未使用這樣的問題或者申請了沒有給予初始值的問題忽略。但是,如果使用了-Wall參數,編輯器將列出所有的警告信息。這樣,您就可以知道您的代碼中有多少可能會在其他操作系統下出錯的地方了。(用這個指令看看你的代碼有多少地方寫的不怎么合適。)
編譯連接時,加入調試代碼
$gcc -g -o yours yours.c |
正如同VC有debug編譯模式一樣,GCC也有debug模式。添加了-g 參數編譯的可執行程序比普通程序略為大一些,其中添加了一些調試代碼。這些代碼將被gdb所支持。
連接時縮小代碼體積
$gcc -s -o yours yours.o |
這個參數,似乎我沒有在Unix環境下看到過。也不知道具體什么作用。因為有人說Visual-MinGW生成的代碼小,於是研究了一下她的編譯參數,發現release模式的編譯參數就加了這一項。貌似編譯后的代碼的確縮小了很多。
獲得幫助
$gcc --help |
這條指令從意思上就能看出,獲得gcc的幫助信息。如果您有什么特殊需要,也許這個指令能幫上點小忙。
以上轉自:http://blog.csdn.net/zhanghan3/archive/2006/10/14/1334308.aspx