首页 > 其他分享 >(一)GCC

(一)GCC

时间:2022-10-18 22:45:36浏览次数:63  
标签:GCC GNU ++ gcc 编译 编译器

1.GCC简介

  • GCC 原名为GNU C语言编译器(GNU C Compiler)
  • GCC (GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言译器。GNU编译器套件包括C、C++、Objective-C、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++, libgcj等)
  • GCC不仅支持C的许多“方言”,也可以区别不同的C语言标准;可以使用命令行选项来控制编译器在翻译源代码时应该遵循哪个C标准。例如,当使用命令行参数'-std=c99'启动GCC时,编译器支持c99标准。
  • 安装命令sudo apt install gcc g++(版本> 4.8.5,4.8.5以后开始支持c++11)
  • 查看版本gcc/g++ -v/--version

2.GCC工作流程

image
源代码如下,用vscode远程连接Linux服务器进行编译。

#include <stdio.h>

int main(){
    printf("Hello World!\n");
    return 0;
}

指定文件名
image
不指定文件名,默认生成a.out文件
image
各流程步骤指令如下

  • 预处理:头文件展开、替换宏、消除注释
    gcc -E test.c -o test.i
  • 编译:将C文件编译成汇编文件
    gcc -S test.i -o test.s
  • 汇编:将汇编文件转成二进制文件(小写c)
    gcc -c test.s -o test.o
  • 链接:将函数库中相应的代码组合到目标文件中
    gcc test.o -o test

3.GCC常用参数选项

gcc编译选项 说明
-E 预处理指定的源文件,不进行编译
-S 编译指定的源文件,但是不进行汇编
-c 编译、汇编指定的源文件,但是不进行链接
-o [file1] [file2] / [file2] -o [ file1] 将文件 file2编译成可执行文件file1
-I directory 指定include包含文件的搜索目录
-g 在编译的时候,生成调试信息,该程序可以被调试器调试
-D 在程序编译的时候,指定一个宏
-w 不生成任何警告信息
-Wall 生成所有警告信息
-On n的取值范围:0~3。编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-l 在程序编译的时候,指定使用的库
-L 指定编译的时候,搜索的库的路径
一fPIC/fpic 生成与位置无关的代码
-shared 生成共享目标文件,通常用在建立共享库时
-std 指定C方言,如:-std=c99,gcc默认的方言是GNU C

4.gcc和g++的区别

gcc和g++都是GNU(组织)的一个编译器。

  • 误区一:gcc只能编译c代码, g++只能编译c++代码。两者都可以,请注意:
    • 后缀为.c的,gcc把它当作是C程序,而g++当作是C++程序
    • 后缀为.cpp 的,两者都会认为是C++程序,C++的语法规则更加严谨一些
    • 编译阶段,g++会调用gcc,对于C++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的
  • 误区二:gcc不会定义__cplusplus宏,而g++会
    • 实际上,这个宏只是标志着编译器将会把代码按C还是 C++语法来解释
    • 如所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义
  • 误区三:编译只能用gcc,链接只能用g++
    • 严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++
    • gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段, g++会自动调用gcc,二者等价

参考文章
gcc编译四个步骤及常用参数
gcc基本使用

标签:GCC,GNU,++,gcc,编译,编译器
From: https://www.cnblogs.com/dalelee/p/16803854.html

相关文章