gcc常用選項
gcc 的使用方法: gcc [選項] 文件名
-v:查看gcc編譯器的版本,顯示gcc執行時的詳細過程
-o :指定輸出文件名為file,不用與編譯文件同名
-E: preprocess only; do not compile, assemble or link(只預處理,不會編譯、匯編、鏈接)
-S:Compile only; do not assemble or link(只編譯需要有已經預處理完成的輸出文件,不會匯編和鏈接)
-c:Compile and assemble, but do not link(預處理 編譯和匯編,不會鏈接)
gcc編譯文件
gcc hello.c :直接默認生成一個a.out文件
gcc -o hello hell.out: 指定生成hello
gcc -E -o hello.i hello.c: 預處理
gcc -S -o hell0.s hello.i:編譯
gcc -c -o hello.o hello.s:編譯匯編
gcc -o hello hello.o:鏈接
小結:
1)輸出文件的后綴名和選項共同決定gcc到底執行哪些操作
2)在編譯過程中除非使用了-E、-S、—c 選項,或者編譯出錯阻止了完整的編譯過程,否則最后的步驟都是鏈接
深入鏈接的過程
鏈接就是將匯編生成的OBJ文件、系統庫的OBJ文件、庫文件鏈接起來,最終生成可以在特定平臺運行的可執行程序。
-lc:鏈接libc庫文件
-nostdlib選項常用于裸機、bootloader、linux內核等程序,因為他們不需要啟動文件,也不需要標準庫文件,一般應用程序才需要系統標準啟動文件和庫文件。
動態鏈接使用動態鏈接庫進行鏈接,生成的程序在執行的時候需要加上動態庫才能運行。動態鏈接生成的程序體積較小,但是必須依賴所需要的動態庫,否則無法運行。
靜態鏈接使用靜態庫進行鏈接,生成的程序包含程序運行所需要的全部庫,可以直接運行,不過靜態鏈接生成的程序體積較大。
Makefile
makefile的引入
組織管理程序
在有多個原文件的情況下,首先要編譯會比較麻煩,再者,每次都會對所有的文件都會執行一次預處理、編譯、匯編、鏈接
如何判斷哪些文件被修改 – 比較時間
makefile規則
目標文件:依賴1 依賴2 …
(使用TAB鍵 )命令
當目標文件不存在或者某個依賴文件比目標文件新
則執行命令
簡單的makefile
假設有a.c和b.c兩個源文件,要生成text
makefile 如下
text:a.o b.o
gcc -o -text a.o b.o
a.o:a.c
gcc -c -o a.o a.c
b.o:b.c
gcc -c -o b.o b.c
分析:第一次執行,a.o b.o都不存在,執行gcc -c -o a.o a.c和gcc -c -o b.o b.c ,之后執行gcc -o -text a.o b.o來生成 a .o b.o;后面用a.o b.o 來執行gcc -o -text a.o b.o來生成text
加入更改了a.c ,則執行make時,因為依賴a.o 和 b.o,先查看a.o,a.o 依賴a.c 改變,執行gcc -c -o a.o a.c,b.o的依賴不變,而后執行gcc -o -text a.o b.o生成目標
makefile語法
使用makefile,用make命令,如果不跟目標,默認第一個目標,
%:通配符
@??:目標文件??@**:目標文件**@??:目標文件??<:第一個依賴
$^:表示所有的依賴
.PHONY:假象目標
clean:
rm *.o
如果同目錄下存在clean文件,則執行make clean后,命令并不會被執行,加上.PHONY: clean后,就可以執行了。
即時變量(簡單變量)、延時變量、export
變量的引用使用$(變量名)
A:=XXX #A的值即確定,在定義時就確定
B =XXX #B的值使用到時才確認
?= XXX #如果是第一次定義,才起效,如果前面已經定義,則不起效
+= XXX #附加,他是即時變量還是延時變量,取決于之前的定義
makefile函數
A = a b c
B = $(foreach f, &(A), &(f).o)
all:
echo B=$(B)
gcc -M c.c // 打印出依賴
gcc -M -MF c.d c.c //把依賴寫入文件c.d
gcc -c -o c.o c.c -MD -MF c.d //編譯c.o,把依賴寫入文件c.d
上一篇:第七篇:gcc和arm-linux-gcc常用選項
下一篇:編譯通過的U-boot和使用的arm-linux-gcc編譯器
推薦閱讀
史海拾趣
Display Elektronik GmbH始終將產品質量放在首位。公司建立了嚴格的質量控制體系,從原材料采購到生產流程,再到成品檢測,每一個環節都嚴格把關。這種對品質的堅持讓Display Elektronik GmbH的產品在市場上贏得了良好的口碑,也為其贏得了眾多知名客戶的信賴。
1985年,庫柏工業收購了Bussmann公司,成立了新的事業部——“Cooper Bussmann熔斷器”。這一收購為Bussmann帶來了更廣闊的市場和更多的資源,同時也帶來了新的挑戰和機遇。在庫柏工業的支持下,Bussmann開始了更加積極的創新和市場拓展,逐漸成為了全球熔斷器行業的領導者。
隨著全球環保意識的提高,DRI Relays Inc公司積極響應環保號召,踐行綠色環保理念。公司采用環保材料和節能技術,減少生產過程中的能源消耗和廢棄物排放。同時,公司還注重產品的回收和再利用,為客戶提供環保解決方案。這些舉措不僅提升了公司的社會形象,還為公司帶來了更多的商業機會和發展空間。
靜芯微電子深知產品質量對于企業的重要性,因此建立了完善的質量管理體系。公司從原材料采購、生產制造到產品檢測等各個環節都實行嚴格的質量控制和管理,確保每一款產品都符合高標準的質量要求。同時,靜芯微電子還引進了先進的檢測設備和技術手段,對產品質量進行全面檢測和評估。這些措施保證了靜芯微電子產品的穩定性和可靠性,贏得了客戶的信任和好評。
隨著公司業務的不斷發展,Cypress開始在全球范圍內拓展市場。公司不僅在加州硅谷設立了最早的設計中心,還在美國的其他州以及英格蘭、愛爾蘭、菲律賓等地設立了設計工廠。此外,Cypress還在菲律賓和印尼設立了組裝、檢測工廠,形成了全球化的生產網絡。這些舉措不僅提高了公司的生產效率和產品質量,也進一步鞏固了Cypress在全球電子芯片市場的地位。
據國外媒體報道,美國IBM在SC2009(超級計算機大會2009)大會中宣稱,他們已經在仿造人類大腦的計算模式上面取得了突破性的成果。 IBM公司此次所取得的關鍵進展主要包括兩大方面,第一就是實現了"大型腦皮層模擬器",第二就是設計了一種 ...… 查看全部問答∨ |
|
LCD型號為LTV250QV-F05,采用IO口模擬SPI總線,通過串口打印可以看到系統一定起來,但屏是白屏,硬件沒有問題,用原程序可以起來看到桌面,懷疑是SPI初始話代碼有錯,那位用過這款屏,給個SPI初始化的代碼… 查看全部問答∨ |
|
vc2005開發嵌入式SDI程序,CCommandBar類中的工具欄步支持彩色圖標 也不能全部顯示所有工具條按鈕(我的16個按鈕只顯示8個,其余的不能顯示)? vc2005開發嵌入式SDI程序,CCommandBar類中的工具欄步支持彩色圖標 也不能全部顯示所有工具條按鈕(我的16個按鈕只顯示8個,其余的不能顯示)? 這個問題如何能解決… 查看全部問答∨ |
unsigned char decTohex(unsigned char n, unsigned char turnto) { int a[20]={0x0}; int i; unsigned char temp; ...… 查看全部問答∨ |
大家好我是一位PLC新手,現在開發一個用三菱F1-20MRPLC控制氣缸上下壓模的接線圖和程序.在IE輸入http://bbs.21ic.com/upfiles/img/20074/2007424104350740.jpg可以看到原理圖,程序在以下可以看見,想問大家2個問題 1.我的接線圖有錯嗎?應怎樣改正? ...… 查看全部問答∨ |
請問各位大俠,我需要一些用C實現的關于Wi-Fi數據傳輸的指導。請賜教。 我是新手 ,請大俠們賜教,使用Wi-Fi傳輸到底是個什么樣的過程,怎么用C實現啊?比如說,我現在電腦上有一些視頻文件,需要傳輸到另外一個電腦上,怎么用C實現?謝謝。… 查看全部問答∨ |