您的位置:首页 > 编程语言 > C语言/C++

[c/c++]GCC使用及其常用的选项的介绍

2017-01-31 09:59 661 查看

GCC使用及其常用的选项的介绍

GCC简介:(翻译官/翻译组织)

GNU编译器套件(GNU Compiler Collection)包括C、C++、Objective-C、Fortran、Java、Ada和Go语言的前端,也包括了这些语言的库(如libstdc++、libgcj等等)。GCC的初衷是为GNU操作系统专门编写的一款编译器。GNU系统是彻底的自由软件。此处,“自由”的含义是它尊重用户的自由。

gcc所遵循的部分约定规则:

.c为后缀的文件,C语言源代码文件;

.a为后缀的文件,是由目标文件构成的档案库文件;

.C,.cc或.cxx 为后缀的文件,是C++源代码文件且必须要经过预处理;

.h为后缀的文件,是程序所包含的头文件;

.i 为后缀的文件,是C源代码文件且不应该对其执行预处理;

.ii为后缀的文件,是C++源代码文件且不应该对其执行预处理;

.m为后缀的文件,是Objective-C源代码文件;

.mm为后缀的文件,是Objective-C++源代码文件;

.o为后缀的文件,是编译后的目标文件;

.s为后缀的文件,是汇编语言源代码文件;

.S为后缀的文件,是经过预编译的汇编语言源代码文件。

在linux 的 shell/bash 中 检查是否有安装gcc ,

gcc -v

假如输出版本号 则已经安装
GCC对于文件的后缀名 要求很高,对于不同的后缀,执行的gcc的命令大略不同

譬如c语言的编译

#include <stdio.h>
int main(){
printf("this is c\n");
return 0;
}

gcc编译

gcc -o build 001.c

则会生产文件夹 build (gcc -o 输出文件) output

gcc 执行则需要执行

./build

那么则输出了 this is c

在调试中,常用 可以看出编译的具体过程

gcc -v -o build 001.c

Apple LLVM version 7.0.0 (clang-700.1.76)
Target: x86_64-apple-darwin14.5.0
Thread model: posix
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.11.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage
-emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name 001.c -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 253.6 -v -dwarf-column-info -resource-dir
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -fdebug-compilation-dir /Users/mac -ferror-limit
19 -fmessage-length 80 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime=macosx-10.11.0 -fencode-extended-block-signature -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/yq/wlxlmxh56b1gvsfrzdz102fw0000gn/T/001-500bcb.o
-x c 001.c
clang -cc1 version 7.0.0 based upon LLVM 3.7.0svn default target x86_64-apple-darwin14.5.0
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/local/include"
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/Library/Frameworks"
#include "..." search starts here:
#include <...> search starts here:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.0/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks (framework directory)
End of search list.
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.11.0 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk
-o build /var/folders/yq/wlxlmxh56b1gvsfrzdz102fw0000gn/T/001-500bcb.o -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.0/lib/darwin/libclang_rt.osx.a

预处理:
cpp -o a.i 001.c
编译:gcc -S [cc1 -o a.s 001.c]
/var/folders/yq/wlxlmxh56b1gvsfrzdz102fw0000gn/T/001-500bcb.o -x c 001.c

汇编 : gcc -c
as -o a.o a.s
链接:gcc -o [gcc -o build 001.c]
-o build a.o.....

举例子:

--编译

gcc -S -o a.s 001.c

生成了a.s 文件

.cfi_offset %rbp, -16

movq %rsp, %rbp

Ltmp2:

.cfi_def_cfa_register %rbp

subq $16, %rsp

leaq L_.str(%rip), %rdi

movl $0, -4(%rbp)

movb $0, %al

callq _printf

xorl %ecx, %ecx

movl %eax, -8(%rbp) ## 4-byte Spill

movl %ecx, %eax

addq $16, %rsp

popq %rbp

retq

.cfi_endproc

.section __TEXT,__cstring,cstring_literals

L_.str: ## @.str

.asciz "xxx\n"

.subsections_via_symbols

--汇编 : gcc -c

gcc -c -o a.o a.s

生成了 a.o 文件 [二进制文件]

^@^@^@^@^@^@^@^@^@^@^@*^@^@^@^@^@^@^@^B^@^@^D^@^@^@°^B^@^@^B^@^@^@^@^D^@<80>^@^@^@^@^@^@^@^@^@^@^@^@__cstring^@^@^@^@^@^@^@__TEXT^@^@^@^@^@^@^@^@^@^@*^@^@^@^@^@^@^@^E^@^@^@^@^@^@^@J^B^@^@^@^@^@^@^@^@^@^@^@^@^@^@^B^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@__compact_unwind__LD^@^@^@^@^@^@^@^@^@^@^@^@0^@^@^@^@^@^@^@^@^@^@^@^@^@^@P^B^@^@^C^@^@^@À^B^@^@^A^@^@^@^@^@^@^B^@^@^@^@^@^@^@^@^@^@^@^@__eh_frame^@^@^@^@^@^@__TEXT^@^@^@^@^@^@^@^@^@^@P^@^@^@^@^@^@^@@^@^@^@^@^@^@^@p^B^@^@^C^@^@^@^@^@^@^@^@^@^@^@^K^@^@h^@^@^@^@^@^@^@^@^@^@^@^@$^@^@^@^P^@^@^@^@^K

^@^@^@^@^@^B^@^@^@^X^@^@^@È^B^@^@^B^@^@^@è^B^@^@^P^@^@^@^K^@^@^@P^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^A^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@UH<89>åH<83>ì^PH<8d>=^[^@^@^@ÇEü^@^@^@^@°^@è^@^@^@^@1É<89>Eø<89>ÈH<83>Ä^P]Ãxxx

^@^@^@^@^@^@^@^@^@^@*^@^@^@^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^T^@^@^@^@^@^@^@^CzR^@^Ax^P^A^P^L^G^H<90>^A^@^@$^@^@^@^\^@^@^@<90>ÿÿÿÿÿÿÿ*^@^@^@^@^@^@^@^@A^N^P<86>^BC^M^F^@^@^@^@^@^@^@^Y^@^@^@^A^@^@-^K^@^@

预处理编译 --条件预处理

#include <stdio.h>
#define ABC
int main(){
#ifdef ABC
printf("%s,%s,%dxxx\n",__FUNCTION__,__FILE__,__LINE__);
#endif
printf("hhh");
return 0;
}
编译 gcc -o build 001.c

或者没有可以通过 gcc -DABC -o build 001.c 控制变量编译的开关 相当于 #define ABC

gcc -c -o a.o a.s
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: