GCC 使用指南及gcc最佳編譯引數(轉)
GCC 使用指南及gcc最佳編譯引數(轉)[@more@]GCC 使用指南使用語法:gcc [ option | filename ]... g++ [ option | filename ]...其中 option 為 gcc 使用時的選項(後面會再詳述), 而 filename 為欲以 gcc 處理的檔案說明:這 C 與 C++ 的 compiler 已將產生新程式的相關程式整合起來。產生一個新的程式需要經過四個階段:預處理、編譯、彙編、連結,而這兩個編譯器都能將輸入的檔案做不同階段的處理。雖然原始程式的副檔名可用來分辨編寫原始程式碼所用的語言,但不同的compiler,其預設的處理程式卻各不相同:gcc 預設經由預處理過(副檔名為.i)的檔案為 C 語言,並於程式 連結階段以 C 的連結方式處理。g++ 預設經由預處理過(副檔名為.i)的檔案為 C++ 語言,並於程序連結階段以 C++ 的連結方式處理。原始程式碼的副檔名指出所用編寫程式所用的語言,以及相對應的處理方法: .c C 原始程式 ; 預處理、編譯、彙編 .C C++ 原始程式 ; 預處理、編譯、彙編 .cc C++ 原始程式 ; 預處理、編譯、彙編 .cxx C++ 原始程式 ; 預處理、編譯、彙編 .m Objective-C 原始程式 ; 預處理、編譯、彙編 .i 已經過預處理之 C 原始程式 ; 編譯、彙編 .ii 已經過預處理之 C++ 原始程式 ; 編譯、彙編 .s 組合語言原始程式 ; 彙編 .S 組合語言原始程式 ; 預處理、彙編 .h 預處理檔案(標標頭檔案) ; (不常出現在指令行)其他副檔名的檔案是由連結程式來處理,通常有: .o Object file .a Archive file除非編譯過程出現錯誤,否則 "連結" 一定是產生一個新程式的最 後階段。然而你也可以以 -c、-s 或 -E 等選項,將整個過程自四 個階段中的其中一個停止。在連結階段,所有與原始碼相對應的 .o 檔案、程式庫、和其他無法自檔名辨明屬性的檔案(包括不以 .o 為副檔名的 object file 以及副檔名為 .a 的 archive file)都會 交由連結程式來處理(在指令行將那些檔案當作連結程式的引數傳給 連結程式)。選項: 不同的選項必須分開來下:例如 `-dr' 這個選項就與 `-d -r' 大 不相同。 絕大部份的 `-f' 及 `-W' 選項都有正反兩種形式:-fname 及 -fno-name (或 -Wname 及 -Wno-name)。以下只列出非預設的那個 形式。 以下是所有選項的摘要。以形式來分類。選項的意義將另闢小節說 明。 一般性(概略、常用的)選項 -c -S -E -o file -pipe -v -x language 程式語言選項 -ansi -fall-virtual -fcond-mismatch -fdollars-in-identifiers -fenum-int-equiv -fexternal-templates -fno-asm -fno-builtin -fno-strict-prototype -fsigned-bitfields -fsigned-char -fthis-is-variable -funsigned-bitfields -funsigned-char -fwritable-strings -traditional -traditional-cpp -trigraphs 編譯時的警告選項 -fsyntax-only -pedantic -pedantic-errors -w -W -Wall -Waggregate-return -Wcast-align -Wcast-qual -Wchar-subscript -Wcomment -Wconversion -Wenum-clash -Werror -Wformat -Wid-clash-len -Wimplicit -Winline -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Wno-import -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wshadow -Wstrict-prototypes -Wswitch -Wtemplate-debugging -Wtraditional -Wtrigraphs -Wuninitialized -Wunused -Wwrite-strings 除錯選項 -a -dletters -fpretend-float -g -glevel -gcoff -gxcoff -gxcoff+ -gdwarf -gdwarf+ -gstabs -gstabs+ -ggdb -p -pg -save-temps -print-file-name=library -print-libgcc-file-name -print-prog-name=program 最佳化選項 -fcaller-saves -fcse-follow-jumps -fcse-skip-blocks -fdelayed-branch -felide-constructors -fexpensive-optimizations -ffast-math -ffloat-store -fforce-addr -fforce-mem -finline-functions -fkeep-inline-functions -fmemoize-lookups -fno-default-inline -fno-defer-pop -fno-function-cse -fno-inline -fno-peephole -fomit-frame-pointer -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fstrength-reduce -fthread-jumps -funroll-all-loops -funroll-loops -O -O2 預處理選項 -Aassertion -C -dD -dM -dN -Dmacro[=defn] -E -H -idirafter dir -include file -imacros file -iprefix file -iwithprefix dir -M -MD -MM -MMD -nostdinc -P -Umacro -undef 彙編程式選項 -Wa,option 連結程式選項 -llibrary -nostartfiles -nostdlib -static -shared -symbolic -Xlinker option -Wl,option -u symbol 目錄選項 -Bprefix -Idir -I- -Ldir Target Options -b machine -V version 與機器(平臺)相關的選項 M680x0 Options -m68000 -m68020 -m68020-40 -m68030 -m68040 -m68881 -mbitfield -mc68000 -mc68020 -mfpa -mnobitfield -mrtd -mshort -msoft-floatVAX Options -mg -mgnu -munixSPARC Options -mepilogue -mfpu -mhard-float -mno-fpu -mno-epilogue -msoft-float -msparclite -mv8 -msupersparc -mcypressConvex Options -margcount -mc1 -mc2 -mnoargcountAMD29K Options -m29000 -m29050 -mbw -mdw -mkernel-registers -mlarge -mnbw -mnodw -msmall -mstack-check -muser-registersM88K Options -m88000 -m88100 -m88110 -mbig-pic -mcheck-zero-division -mhandle-large-shift -midentify-revision -mno-check-zero-division -mno-ocs-debug-info -mno-ocs-frame-position -mno-optimize-arg-area -mno-serialize-volatile -mno-underscores -mocs-debug-info -mocs-frame-position -moptimize-arg-area -mserialize-volatile -mshort-data-num -msvr3 -msvr4 -mtrap-large-shift -muse-div-instruction -mversion-03.00 -mwarn-passed-structs RS6000 Options -mfp-in-toc -mno-fop-in-tocRT Options -mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs -mfull-fp-blocks -mhc-struct-return -min-line-mul -mminimum-fp-blocks -mnohc-struct-returnMIPS Options -mcpu=cpu type -mips2 -mips3 -mint64 -mlong64 -mlonglong128 -mmips-as -mgas -mrnames -mno-rnames -mgpopt -mno-gpopt -mstats -mno-stats -mmemcpy -mno-memcpy -mno-mips-tfile -mmips-tfile -msoft-float -mhard-float -mabicalls -mno-abicalls -mhalf-pic -mno-half-pic -G num -nocppi386 Options -m486 -mno-486 -msoft-float -mno-fp-ret-in-387HPPA Options -mpa-risc-1-0 -mpa-risc-1-1 -mkernel -mshared-libs -mno-shared-libs -mlong-calls -mdisable-fpregs -mdisable-indexing -mtrailing-colon i960 Options -mcpu-type -mnumerics -msoft-float -mleaf-procedures -mno-leaf-procedures -mtail-call -mno-tail-call -mcomplex-addr -mno-complex-addr -mcode-align -mno-code-align -mic-compat -mic2.0-compat -mic3.0-compat -masm-compat -mintel-asm -mstrict-align -mno-strict-align -mold-align -mno-old-align DEC Alpha Options -mfp-regs -mno-fp-regs -mno-soft-float -msoft-float System V Options -G -Qy -Qn -YP,paths -Ym,dir Code Generation Options -fcall-saved-reg -fcall-used-reg -ffixed-reg -finhibit-size-directive -fnonnull-objects -fno-common -fno-ident -fno-gnu-linker -fpcc-struct-return -fpic -fPIC -freg-struct-returno -fshared-data -fshort-enums -fshort-double -fvolatile -fvolatile-global -fverbose-asmPRAGMAS Two `#pragma' directives are supported for GNU C++, to permit using the same header file for two purposes: as a definition of interfaces to a given object class, and as the full definition of the contents of that object class. #pragma interface (C++ only.) Use this directive in header files that define object classes, to save space in most of the object files that use those classes. Nor- mally, local copies of certain information (backup copies of inline member functions, debugging infor- mation, and the internal tables that implement vir- tual functions) must be kept in each object file that includes class definitions. You can use this pragma to avoid such duplication. When a header file containing `#pragma interface' is included in a compilation, this auxiliary information will not be generated (unless the main input source file it- self uses `#pragma implementation'). Instead, the object files will contain references to be resolved at link time. #pragma implementation #pragma implementation "objects.h" (C++ only.) Use this pragma in a main input file, when you want full output from included header files to be generated (and made globally visible). The included header file, in turn, should use `#pragma interface'. Backup copies of inline mem- ber functions, debugging information, and the in- ternal tables used to implement virtual functions are all generated in implementation files. If you use `#pragma implementation' with no argu- ment, it applies to an include file with the same basename as your source file; for example, in `allclass.cc', `#pragma implementation' by itself is equivalent to `#pragma implementation "allclass.h"'. Use the string argument if you want a single implementation file to include code from multiple header files. There is no way to split up the contents of a sin- gle header file into multiple implementation files.檔案說明 file.c C source file file.h C header (preprocessor) file file.i 經預處理過的 C source file file.C C++ source file file.cc C++ source file file.cxx C++ source file file.m Objective-C source file file.s assembly language file file.o object file a.out link edited output TMPDIR/cc* temporary files LIBDIR/cpp preprocessor LIBDIR/cc1 compiler for C LIBDIR/cc1plus compiler for C++ LIBDIR/collect linker front end needed on some machines LIBDIR/libgcc.a GCC subroutine library /lib/crt[01n].o start-up routine LIBDIR/ccrt0 additional start-up routine for C++ /lib/libc.a standard C library, 參閱 man page intro(3) /usr/include standard directory for #include files LIBDIR/include standard gcc directory for #include files LIBDIR/g++-include additional g++ directory for #include LIBDIR is usually /usr/local/lib/machine/version. TMPDIR comes from the environment variable TMPDIR (default /usr/tmp if available, else /tmp).gcc最佳編譯引數摘要 本文著重介紹在不同的硬體環境下給GCC指定哪些引數才可以得到最佳的效能。 這篇文章是從一個名為Gentoo Linux的發行版的程式設計說明書裡面分離出來的,希望對大家編譯程式有幫助。--------------------------------------------------------------------------------一、1.2版(gcc 2.9.x版)i386 (Intel), do you really want to install gentoo on that? CHOST="i386-pc-linux-gnu" CFLAGS="-march=i386 -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=i386 -O3 -pipe -fomit-frame-pointer"i486 (Intel), do you really want to install gentoo on that? CHOST="i486-pc-linux-gnu" CFLAGS="-march=i486 -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=i486 -O3 -pipe -fomit-frame-pointer"Pentium, Pentium MMX+, Celeron (Mendocino) (Intel) CHOST="i586-pc-linux-gnu" CFLAGS="-march=pentium -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=pentium -O3 -pipe -fomit-frame-pointer"Pentium Pro/II/III/4, Celeron (Coppermine), Celeron (Willamette?) (Intel) CHOST="i686-pc-linux-gnu" CFLAGS="-march=i686 -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=i686 -O3 -pipe -fomit-frame-pointer"Eden C3/Ezra (Via) CHOST="i586-pc-linux-gnu" CFLAGS="-march=i586 -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=i586 -O3 -pipe -fomit-frame-pointer"Quote : I did the original gentoo install using 1.2, with gcc 2.95 using -march=i586. i686 won't work.K6 or beyond (AMD) CHOST="i586-pc-linux-gnu" CFLAGS="-march=k6 -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=k6 -O3 -pipe -fomit-frame-pointer"(A Duron will report "Athlon" in its /proc/cpuinfo)Athlon (AMD) CHOST="i686-pc-linux-gnu" CFLAGS="-march=k6 -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=k6 -O3 -pipe -fomit-frame-pointer"For the following, i don't know of any flag that enhance performances..., do you ?PowerPC CHOST="powerpc-unknown-linux-gnu" CFLAGS="-O3 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -pipe -fomit-frame-pointer"Sparc CHOST="sparc-unknown-linux-gnu" CFLAGS="-O3 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -pipe -fomit-frame-pointer"Sparc 64 CHOST="sparc64-unknown-linux-gnu" CFLAGS="-O3 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -pipe -fomit-frame-pointer"二、1.4版(gcc 3.x版):i386 (Intel), do you really want to install gentoo on that ? CHOST="i386-pc-linux-gnu" CFLAGS="-march=i386 -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=i386 -O3 -pipe -fomit-frame-pointer"i486 (Intel), do you really want to install gentoo on that ? CHOST="i486-pc-linux-gnu" CFLAGS="-march=i486 -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=i486 -O3 -pipe -fomit-frame-pointer"Pentium 1 (Intel) CHOST="i586-pc-linux-gnu" CFLAGS="-march=pentium -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=pentium -O3 -pipe -fomit-frame-pointer"Pentium MMX (Intel) CHOST="i586-pc-linux-gnu" CFLAGS="-march=pentium-mmx -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=pentium-mmx -O3 -pipe -fomit-frame-pointer"Pentium PRO (Intel) CHOST="i686-pc-linux-gnu" CFLAGS="-march=pentiumpro -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=pentiumpro -O3 -pipe -fomit-frame-pointer"Pentium II (Intel) CHOST="i686-pc-linux-gnu" CFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"Celeron (Mendocino), aka Celeron1 (Intel) CHOST="i686-pc-linux-gnu" CFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"Pentium III (Intel) CHOST="i686-pc-linux-gnu" CFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer"Celeron (Coppermine) aka Celeron2 (Intel) CHOST="i686-pc-linux-gnu" CFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer"Celeron (Willamette?) (Intel) CHOST="i686-pc-linux-gnu" CFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"Pentium 4 (Intel) CHOST="i686-pc-linux-gnu" CFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"Eden C3/Ezra (Via) CHOST="i586-pc-linux-gnu" CFLAGS="-march=i586 -m3dnow -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=i586 -m3dnow -O3 -pipe -fomit-frame-pointer"quote : the ezra doesn't have any special instructions that you could optimize for, just consider is a K6-3...basically a p2 with 3dnowK6 (AMD) CHOST="i586-pc-linux-gnu" CFLAGS="-march=k6 -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=k6 -O3 -pipe -fomit-frame-pointer"K6-2 (AMD) CHOST="i586-pc-linux-gnu" CFLAGS="-march=k6-2 -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=k6-2 -O3 -pipe -fomit-frame-pointer"K6-3 (AMD) CHOST="i586-pc-linux-gnu" CFLAGS="-march=k6-3 -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=k6-3 -O3 -pipe -fomit-frame-pointer"Athlon (AMD) CHOST="i686-pc-linux-gnu" CFLAGS="-march=athlon -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=athlon -O3 -pipe -fomit-frame-pointer"Athlon-tbird, aka K7 (AMD) CHOST="i686-pc-linux-gnu" CFLAGS="-march=athlon-tbird -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=athlon-tbird -O3 -pipe -fomit-frame-pointer"Athlon-tbird XP (AMD) CHOST="i686-pc-linux-gnu" CFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"Athlon 4(AMD) CHOST="i686-pc-linux-gnu" CFLAGS="-march=athlon-4 -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=athlon-4 -O3 -pipe -fomit-frame-pointer"Athlon XP (AMD) CHOST="i686-pc-linux-gnu" CFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"Athlon MP (AMD) CHOST="i686-pc-linux-gnu" CFLAGS="-march=athlon-mp -O3 -pipe -fomit-frame-pointer" CXXFLAGS="-march=athlon-mp -O3 -pipe -fomit-frame-pointer"603 (PowerPC) CHOST="powerpc-unknown-linux-gnu" CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char" CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"603e (PowerPC) CHOST="powerpc-unknown-linux-gnu" CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char" CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"604 (PowerPC) CHOST="powerpc-unknown-linux-gnu" CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char" CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"604e (PowerPC) CHOST="powerpc-unknown-linux-gnu" CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char" CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"750 aka as G3 (PowerPC) CHOST="powerpc-unknown-linux-gnu" CFLAGS="-mcpu=750 -O3 -pipe -fomit-frame-pointer -fsigned-char" CXXFLAGS="-mcpu=750 -O3 -pipe -fomit-frame-pointer -fsigned-char"Note: do not use -march=7400, aka G4 (PowerPC) CHOST="powerpc-unknown-linux-gnu" CFLAGS="-mcpu=7400 -O3 -pipe -fomit-frame-pointer -fsigned-char -maltivec" CXXFLAGS="-mcpu=7400 -O3 -pipe -fomit-frame-pointer -fsigned-char -maltivec"Note: do not use -march=7450, aka G4 second generation (PowerPC) CHOST="powerpc-unknown-linux-gnu" CFLAGS="-mcpu=7450 -O3 -pipe -fomit-frame-pointer -fsigned-char -maltivec" CXXFLAGS="-mcpu=7450 -O3 -pipe -fomit-frame-pointer -fsigned-char -maltivec"Note: do not use -march=PowerPC (If you don't know which one) CHOST="powerpc-unknown-linux-gnu" CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char" CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"Sparc CHOST="sparc-unknown-linux-gnu" CFLAGS="-O3 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -pipe -fomit-frame-pointer"Sparc 64 CHOST="sparc64-unknown-linux-gnu" CFLAGS="-O3 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -pipe -fomit-frame-pointer"GCC 使用指南 GCC 使用指南 GCC 使用指南閱讀:989次責任編輯:tseteen
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-944750/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- gcc最佳編譯引數(轉)GC編譯
- 探索gcc編譯最佳化細節 編譯器最佳化gcc -o3GC編譯
- gcc編譯GC編譯
- GCC引數詳解(轉)GC
- 安裝 GCC 編譯器(轉)GC編譯
- gcc編譯引數-fPIC的一些問題GC編譯
- GCC編譯選項GC編譯
- GCC 編譯選項GC編譯
- gcc編譯器小知識FAQ(轉)GC編譯
- gcc編譯cpp檔案GC編譯
- GCC編譯器的使用GC編譯
- 開源編譯器 GCC 跨越 5.0,釋出 GCC 5.1編譯GC
- gcc 編譯器與 clang 編譯器GC編譯
- gcc 常用引數介紹GC
- Linux中gcc編譯工具LinuxGC編譯
- linux下的gcc編譯LinuxGC編譯
- gcc 編譯多個原始檔GC編譯
- FreeBSD中的GNU C編譯器--編譯器GCC(轉)編譯GC
- GNU 編譯器家族 GCC 內部探密(轉)編譯GC
- 用ccache加速你的gcc/g++編譯(轉)GC編譯
- GCC編譯和連結過程GC編譯
- GCC編譯器背後的故事GC編譯
- Linux gcc編譯器安裝LinuxGC編譯
- Linux上安裝GCC編譯器過程(轉)LinuxGC編譯
- gcc 和 g++ 的聯絡和區別,使用 gcc 編譯 c++GC編譯C++
- 記錄一次gcc的編譯GC編譯
- 編譯器GCC與Clang的異同編譯GC
- linux下gcc/g++編譯用法LinuxGC編譯
- GCC編譯過程(預處理->編譯->彙編->連結)GC編譯
- [c++/gcc] Centos 7.9升級 gcc 4.8.5 到 gcc11 [轉]C++GCCentOS
- 32位支援:使用 GCC 交叉編譯GC編譯
- redhat 6.5 gcc編譯器初識之一RedhatGC編譯
- opensuse linux安裝gcc編譯環境LinuxGC編譯
- 記一次編譯GCC的經歷編譯GC
- gcc常用的編譯選項對程式碼的影響(轉)GC編譯
- GCC 內聯彙編GC
- Gcc HowTo(轉)GC
- gcc 簡介(轉)GC