首页 > 其他分享 >GCC编译C语言基础

GCC编译C语言基础

时间:2022-10-06 15:36:00浏览次数:114  
标签:GCC GNU int C语言 编译 test 断点 hello 调试

菜鸟

#include<stdio.h>
int main()
{
  printf("Hello World!");
  return 0;
}
cloudray@ubuntu:~/test/testc$ gcc -o test hello.c
cloudray@ubuntu:~/test/testc$ ls
hello.c  test
cloudray@ubuntu:~/test/testc$ ./test
Hello World!

GCC简介

 GCC,全名GNU编译器套件(GNU Compiler Collection)。由GNU开发的编程语言编译器,包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等)。
 支持在各种处理器架构上使用。
(ps:关于GNU可以继续深入了解)
 The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Ada, Go, and D, as well as libraries for these languages (libstdc++,...). GCC was originally written as the compiler for the GNU operating system. The GNU system was developed to be 100% free software, free in the sense that it respects the user's freedom.
GCC, the GNU Compiler Collection - GNU Project

编译器组件

 分析器:将程序语言变为汇编程序
 汇编器:将汇编语言转换为CPU可执行字节码(二进制)
 链接器:将汇编器生成的单独目标文件组合成可执行的应用程序。链接器需要知道这种目标格式一边工作。
 标准C库:主要与常用的C程序库,通过链接器与源代码连接。

支持后缀

文件后缀 描述
.c C语言源文件
.C/.cc/.cxx/.cpp C++ 源文件
.h C/C++ 头文件
.i/.ii 经过预处理的 C/C++ 文件
.s/.S 汇编语言源文件
.o/.obj 静态库
.so/.dll 动态库
.a/.so 编译后的库文件

GCC基本参数

命令 作用
-c 只进行编译过程,而不链接成可执行文件,编译器只是将输入的源代码(.c/c++、java、python等)生成.o为后缀的目标文件(objective file),通常用于编译不包含主程序的子程序。
-o 确定输出文件名,注意输出文件名不能和源文件同名;如果不给出该调用参数,gcc就给出默认的可执行文件a.out。
-g 生成符号调试工具(GNU的gdb)所需要的符号信息,想要对源代码进行调试,必须加入这个选项。
-E 仅执行预处理操作,而不进行编译、汇编和链接操作。
-S 仅执行编译操作,而不进行汇编、链接操作
-O 对程序进行优化编译、链接操作,提高可执行文件的执行效率,但编译链接也会慢一点。
-O2 更高级别优化,也会更慢。
-w 禁止显示任何警告信息
-Wall 显示全部警告信息

编译流程

在这里插入图片描述

 1. 预处理(Pre-Processing)
 2. 编译(Compiling)
 3. 汇编(Assembling)
 4. 链接(Linking)
在这里插入图片描述

逐步生成可执行文件

cloudray@ubuntu:~/test/testc$ gcc -E hello.c -o hello.i #包含头文件
cloudray@ubuntu:~/test/testc$ gcc -S hello.c -o hello.s #汇编代码
cloudray@ubuntu:~/test/testc$ gcc -c hello.s -o hello.o #二进制文件
cloudray@ubuntu:~/test/testc$ gcc hello.o -o hello #可执行文件
cloudray@ubuntu:~/test/testc$ ./hello
Hello World!

常见错误

  1. C语法错误
  2. 头文件错误
  3. 档案库错误
  4. 未定义错误

GDB调试基础

 Unix下的调试工具。一般来说,GDB主要帮助你完成下面四个方面的功能:
 1. 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
 2. 可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
 3. 当程序被停住时,可以检查此时你的程序中所发生的事。
 4. 你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。

基础命令。

命令(简写) 作用
gdb -t .c 生成可调试的可执行文件
gdb 可执行文件 进入该文件的调试界面
list(l) 显示接下来的十行代码
start 开始调试,在主函数第一行处停止(即自动设置断点)
run(r) 运行(遇到断点才停止)
next(n) 逐步执行
break(b) 设置一般断点,可在特点行数或者函数处设置
info break(b) 查看所有断点信息
s 进入下一个将要运行的函数
p 查看特定变量值
quit(q) 退出gdb调试
回车 重复上一条命令

示例

#include <stdio.h>
int sum(int a, int b);
int fun(int a, int b);
int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    printf("开始\n");
    printf("a+b=%d\n", sum(a, b));
    fun(a,b);
    return 0;
}
int sum(int a,int b)
{
    return (a + b);
}

int fun2(int a, int b);
int fun(int a,int b)
{
    printf("axb=%d\n",a*b);
    fun2(a,b);
    return 0;
}
int fun2(int a,int b)
{
    printf("a/b=%d\n",a/b);
    return 0;
}

第一步:生成调试文件

gcc -g test.c -o test

第二步:进入该文件的调试界面

gdb 可执行文件

显示代码:list(l)
一次显示10行,回车表示重复上次命令。
在这里插入图片描述
开始运行:run(r)
直到所设断点。
在这里插入图片描述
设置一般断点,并查看所有断点情况。
break(b)
info break(b)
在这里插入图片描述
逐步执行:next(n)
先自动运行到断点处,再逐步执行,回车重复,且不进入内部函数。
在这里插入图片描述
开始调试:start
停留在主函数第一行。
在这里插入图片描述
进入函数:s
逐步调试,但会进入每一个内部函数,包括printf。
在这里插入图片描述
退出函数:finish
在这里插入图片描述
查看与打印变量或地址:print(p)
在这里插入图片描述
在这里插入图片描述
退出调试: quit(q)
在这里插入图片描述

标签:GCC,GNU,int,C语言,编译,test,断点,hello,调试
From: https://www.cnblogs.com/cloudraysun/p/16757705.html

相关文章

  • C语言学习的第一篇博客
    今年40,一直从事医药行业的销售工作,现在越来越发现销售类的工作没有未来,反倒是觉得以前不屑一顾的公务员、事业单位和技术类的工作是不错的,因为这些工作重在积累,当然公务员及......
  • C语言:水仙花数:阿姆斯特朗数 也就是俗称的 水仙花数 ,是指一个三位数,其各位数字的立方和
    #include<stdio.h>main(){inta,b,c,i;for(a=1;a<=9;a++)for(b=0;b<=9;b++)for(c=0;c<=9;c++)if(a*a*a+b*b*b+c*c*c==a*100+b*10+c)printf(......
  • Mysql_5.7编译部署
    自述-概述:数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合;本文主要介绍mysql_5.7......
  • C语言每日一题——第九天
    第九天在一开始的学习中,小明就头疼于计算机浮点数运算的误差。他决定看看浮点数的二进制是什么样的——尽管这么做对解决误差问题毫无帮助。输入程序执行时,通过scanf输......
  • gRPC框架学习:4、proto文件编译
    gRPC框架学习:4、proto文件编译文章目录​​gRPC框架学习:4、proto文件编译​​​​1.前言​​​​2.编译器总的地址​​​​3.具体语言编译器地址​​1.前言通过前面的学......
  • C语言学习记录4
    #每日落日分享#今天浅显的学习了'getchar',现在记录下来。#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){intch=0;charpassword[20]={0};......
  • 【C语言_15】自定义函数和math库函数详解篇!
    一.函数的概念1.什么是函数?函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码。函数可以提前保存起来,并给它起一个独一无二的名......
  • 在C语言下Socket函数使用
    Socket介绍Socket中文意思是“插座”,在Linux环境下,用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。既然是文件,那么理所当然的,我们可以使用文......
  • 14_编译FFmpeg
    本文来详细讲解一下:如何在Mac、Windows环境下成功编译FFmpeg。目标这里先提前说明一下,最后希望达到的效果:编译出ffmpeg、ffprobe、ffplay三个命令行工具只产生动态......
  • 虚拟内存到底是什么?为什么我们在C语言中看到的地址是假的?
    在C语言中,指针变量的值就是一个内存地址,&运算符的作用也是取变量的内存地址,请看下面的代码:#include<stdio.h>#include<stdlib.h>inta=1,b=255;intmain(){......