編譯優化選項
gcc -E source_file.c
-E,只執行到預編譯。直接輸出預編譯結果。gcc -S source_file.c
-S,只執行到源代碼到匯編代碼的轉換,輸出匯編代碼。gcc -c source_file.c
-c,只執行到編譯,輸出目標文件。gcc (-E/S/c/) source_file.c -o output_filename
-o, 指定輸出文件名,可以配合以上三種標簽使用。
-o 參數可以被省略。這種情況下編譯器將使用以下默認名稱輸出:
-E:預編譯結果將被輸出到標准輸出埠(通常是顯示器)
-S:生成名為source_file.s的匯編代碼
-c:生成名為source_file.o的目標文件。
無標簽情況:生成名為a.out的可執行文件。gcc -g source_file.c
-g,生成供調試用的可執行文件,可以在gdb中運行。由於文件中包含了調試信息因此運行效率很低,且文件也大不少。
這里可以用strip命令重新將文件中debug信息刪除。這是會發現生成的文件甚至比正常編譯的輸出更小了,這是因為strip把原先正常編譯中的一些額外信息(如函數名之類)也刪除了。用法為 strip a.outgcc -s source_file.c
-s, 直接生成與運用strip同樣效果的可執行文件(刪除了所有符號信息)。gcc -O source_file.c
-O(大寫的字母O),編譯器對代碼進行自動優化編譯,輸出效率更高的可執行文件。
-O 後面還可以跟上數字指定優化級別,如:
gcc -O2 source_file.c
數字越大,越加優化。但是通常情況下,自動的東西都不是太聰明,太大的優化級別可能會使生成的文件產生一系列的bug。一般可選擇2;3會有一定風險。gcc -Wall source_file.c
-W,在編譯中開啟一些額外的警告(warning)信息。-Wall,將所有的警告信息全開。gcc source_file.c -L/path/to/lib -lxxx -I/path/to/include
-l, 指定所使用到的函數庫,本例中鏈接器會嘗試鏈接名為libxxx.a的函數庫。
-L,指定函數庫所在的文件夾,本例中鏈接器會嘗試搜索/path/to/lib文件夾。
-I, 指定頭文件所在的文件夾,本例中預編譯器會嘗試搜索/path/to/include文件夾。
㈡ Dev C++ 編譯器選項中的優化級別哪個對應不優化
ide沒有優化的功能吧,只有編譯器才有,mplab只是環境而以,而編譯器是picc或c18啊,他們才有優化的本事
㈢ VC編譯器中「優選大小或速度」和「優化」選項的設置區別在哪裡
VC中的優化裡面的 按大小優化 與 按速度優化 是分開選的,不能同時選擇兩者
㈣ Linux 0.11內核編譯錯誤記錄
現象1: 提示gas gld 比識別
措施: gnu編譯器發展到後來,越來越流行,更多使用別名為 as ld gcc等.
現象2: 提示位元組對齊需要是 2的倍數
措施: 具體解決方法: 利用命令 sed -i 's/align 2/align 4/g' filename 替換align 2 為 align 4(align 3 替換為 align 8)
sed -i 's/align 2/align 4/g' boot/head.s
sed -i 's/align 3/align 8/g' boot/head.s
現象3: -fcombine-regs -mstring-insns選項不識別
措施: 此兩個選項已經過時,直接去掉即可
現象4: warning 特別多
措施: 將-Wall 替換為 -w
現象5: __stack_chk_fail 未定義
措施: 去網上搜了一下,在Makefile中的$(CFLAGS)後面加上-fno-stack-protector,即不需要棧保護
現象6: main.c 中_syscall0重復定義
措施: main.c static inline _syscall0(int, fork) 去掉static即可
現象7: 提示內嵌匯編不符合語法限制
措施: 類似的問題在後面編譯中出現好多,C內嵌匯編的格式 asm (匯編語句:輸入寄存器:輸出寄存器:可能被修改的寄存器),最新的GCC規定 輸入或輸出寄存器不能出現在可能被修改的寄存器中,目前看到網上的方法是把所有類似問題的可能被修改的寄存器全部刪掉 解決方案:find -type f -exec sed -i 's/:"w{2}"(,"w{2}") )/:) /g' {} ; 其中's/:"w{2}"(,"w{2}") /:/g'
現象8: 在 control.c 中清楚定義了 static unsigned char attr = 0x70 ,而在鏈接 control.o 時,卻爆出 attr未定義。
措施: 用 nm -C control.o 查看其符號,發現attr確實處於未定義狀態。故單獨編譯一個小程序定義靜態變數,查看其 .o 文件中,發現靜態變數定義正常。故考慮為編譯選項差異導致,最終發現因為 -O 編譯優化選項導致,目前處理方式是去掉該選項。
現象9: build.c:(.text+0xde): undefined reference to `MAJOR'
措施: 通過分析編譯列印信息,發現編譯時沒有加入頭文件路徑 -Iinclude
現象10: fs/fs.o: In function check_disk_change':(.text+0x1b2f): undefined reference to invalidate_buffers'
措施: 查找發現此函數定義在buffer.c 中,且為內聯函數, 故嘗試將其更改為普通函數, 然後編譯通過.
現象11: 編譯 build.c 時報錯:/usr/include/i386-linux -gnu/bits/stdio2.h:57:8: error: unknown type name 『__gnuc_va_list』
措施: 分析發現時此系列錯誤均由 -Iinclude 選項導致, 而該選項在 想像9 中加入, 故考慮去掉該選項, 直接在build.c 中加入 MAJOR 宏定義.
㈤ visual C++ 的優化選項分別都是什麼意思
Od:編譯器不做優化,通常debug的使用這個編譯選項
O1:代碼最小,使用這個選項編譯出來的二進制文件是最小的,但是可能會犧牲一些執行效率
O2:編譯出來的代碼執行速度最快,但是大小會比O1大(release默認)
Ox:對程序進行最大優化,可能會犧牲一些兼容性問題等,對執行速度和二進制文件大小都盡可能優化
㈥ 如何使用ccs c編譯器中的優化選項
CCS3.3既支持c程序設計又支持C++,當你的源程序的文件後綴採用.c時,CCS用c編譯器編譯程序,當使用.cpp後綴時,用C++編譯器。
