【Linux】使用gcc调试程序

这篇具有很好参考价值的文章主要介绍了【Linux】使用gcc调试程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🥇🥇【Liunx学习记录篇】-持续更新中~🥇🥇


篇一:【Linux】VMware安装unbuntu18.04虚拟机-超详细步骤(附镜像文件)
篇二:【Linux】ubuntu18.04系统基础配置及操作
篇三:【Linux】用户与组的操作详细介绍
篇四:【Linux】管理Linux文件权限属性介绍
篇五:【Linux】使用数字表示法和文件表示法修改文件权限(超详细)
篇六:【Linux】配置网络和firewall防火墙(超详细介绍+实战)

一.安装gcc

1.认识gcc

【Linux】使用gcc调试程序

GNU编译器集合(GNU Compiler Collection,gcc)是一套由GNU开发的编程语言编译器。它是一套GNU编译器套装,是以GPL许可证发行的自由软件,也是GNU计划的关键部分。gcc原本作为GNU操作系统的官方编译器,现已被大多数UNIX操作系统(如Linux、BSD、macOS等)采纳为标准的编译器。gcc同样适用于微软的Windows操作系统。

gcc原名为GNU C语言编译器,因为它原本只能处理C语言。但gcc后来得到扩展,变得既可以处理C++,又可以处理Fortran、GO.Objective-C/D,以及Ada与其他语言。

2.安装gcc

1.检查是否安装gcc

[root@master ~]# rpm -qa|grep gcc
libgcc-4.8.5-16.0.3.el7_4.2.x86_64

【Linux】使用gcc调试程序
上述结果表示没有安装gcc

2.使用yum命令安装gcc

yum install gcc

安装完之后,我们再使用上面的rpm命令检查是否有软件包

[root@master etc]# rpm -qa|grep gcc
gcc-4.8.5-44.0.3.el7.x86_64
libgcc-4.8.5-44.0.3.el7.x86_64
[root@master etc]# 

【Linux】使用gcc调试程序
如图所示就是成功安装gcc

二.编译与测试单一程序

1.编辑程序代码即源码

[root@master test]# vim hello.c //用c语言写的程序扩展名建议用.c
[root@master test]# cat hello.c 
#include <stdio.h>
int main(void)
{
	printf("Hello World\n");
}
[root@master test]# 

上面是用C语言的语法写成的一个程序文件。第一行的"#"并不是注解

2.开始编译与测试运行

[root@master test]# gcc hello.c 
[root@master test]# ll hello.c a.out 
-rwxr-xr-x 1 root root 8560 511 17:11 a.out  <==此时会生成这个文件名
-rw-r--r-- 1 root root   65 511 17:10 hello.c
[root@master test]# ./a.out 
Hello World <==运行结果
[root@master test]# 

在正常情况下,直接以gcc编译源码,并且没有加上任何参数,则可执行文件的文件名就会自动设置为a.out,并且能够执行./a.out这个可执行文件

将上面的例子的生成目标文件(Object File)来进行其他操作,而且可执行文件的文件名也不要用默认的a.out,可以使用以下命令:

[root@master test]# gcc -c hello.c 
[root@master test]# ll hello*
-rw-r--r-- 1 root root   65 511 17:10 hello.c
-rw-r--r-- 1 root root 1496 511 17:16 hello.o <==这就是生成的目标文件
[root@master test]# gcc -o hello hello.o <==小写字母o
[root@master test]# ll hello*
-rwxr-xr-x 1 root root 8560 511 17:16 hello  <==这就是可执行文件(-o的结果)
-rw-r--r-- 1 root root   65 511 17:10 hello.c
-rw-r--r-- 1 root root 1496 511 17:16 hello.o
[root@master test]# ./hello 
Hello World
[root@master test]# 

以上例子主要是利用hello.o这个目标文件生成一个名为hello的可执行文件,可以得到hello以及hello.o两个文件,真正可以执行的是hello这个二进制文件

三.编译与链接主程序和子程序

1.撰写主程序、子程序

主程序:

[root@master test]# vim thanks.c
[root@master test]# cat thanks.c 
#include <stdio.h>
int main(void)
{
	printf("Hello World\n");
	thanks_2();
}

下面的thanks_2()就是要调用的子程序:

[root@master test]# vim thanks_2.c
[root@master test]# cat thanks_2.c 
#include <stdio.h>
void thanks_2(void)
{
	printf("Thank you!\n");
}
[root@master test]# 

2.编译与链接程序

1.将源码编译为可执行的二进制文件(警告内容可忽略):

[root@master test]# gcc -c thanks.c thanks_2.c 
[root@master test]# ll
total 16
-rw-r--r-- 1 root root   68 511 17:26 thanks_2.c
-rw-r--r-- 1 root root 1504 511 17:28 thanks_2.o  <==编译生成的目标文件
-rw-r--r-- 1 root root   77 511 17:23 thanks.c
-rw-r--r-- 1 root root 1560 511 17:28 thanks.o   <==编译生成的目标文件
[root@master test]# gcc -o thanks thanks.o thanks_2.o   <==小写字母o
[root@master test]# ll thanks
-rwxr-xr-x 1 root root 8632 511 17:29 thanks <==最终生成的可执行文件

2.运行可执行文件:

[root@master test]# ./thanks 
Hello World
Thank you!
[root@master test]# 

3.如果想要程序在运行的时候具有比较好的性能,或者是其他的调试功能,则可以在编译过程中加入适当的选项,例如:

[root@master test]# gcc -O -c thanks.c thanks_2.c  <== -O为生成优化的选项
[root@master test]# gcc -Wall -c thanks.c thanks_2.c
thanks.c: 在函数‘main’中:
thanks.c:5:2: 警告:隐式声明函数‘thanks_2’ [-Wimplicit-function-declaration]
  thanks_2();
  ^
thanks.c:6:1: 警告:在有返回值的函数中,控制流程到达函数尾 [-Wreturn-type]
 }
 ^
[root@master test]# 

上方代码的-Wall 是显示更详细的编译过程信息。上面的信息为警告信息,不用理会也没关系。

四.调用外部函数库:加入链接的函数库

1.编写一个计算三角函数的sin90°的程序

[root@master test]# vim sin.c
[root@master test]# cat sin.c
#include <stdio.h>
int main(void)
{
	
	float value;
	value = sin ( 3.14/ 2 );
	printf("%f\n",value);
}

[root@master test]# 

我们这样正常编译这个文件,会出现以下错误:

[root@master test]# gcc sin.c 
sin.c: 在函数‘main’中:
sin.c:6:10: 警告:隐式声明与内建函数‘sin’不兼容 [默认启用]
  value = sin ( 3.14/ 2 );
          ^
[root@master test]# 

这是因为C语言中的sin函数是写在libm.so函数库中的,而我们并没有将函数库加进去,我们对源代码进行这样更正:

[root@master test]# vim sin.c
[root@master test]# cat sin.c 
#include <stdio.h>
#include <math.h>
int main(void)
{
	
	float value;
	value = sin ( 3.14/ 2 );
	printf("%f\n",value);
}

[root@master test]# gcc sin.c -lm -L/lib -L/user/lib   <==重点在 -lm
[root@master test]# ./a.out  <==尝试执行新文件
1.000000
[root@master test]# 

-lm的解释:

  • -l:加入某个函数库(library)
  • -m:是libm.so函数库,其中,lib与扩展名(.a或.so)不需要写

五.使用gcc(编译、参数与链接)

1.仅将原始码编译为目标文件

仅将原始码编译为目标文件,并不制作链接等功能

[root@master test]# gcc -c hello.c

上述程序会自动生成hello.o文件,但不会生成二进制可执行文件

2.优化编译时的执行速度

在编译时,依据作业环境执行速度:

[root@master test]# gcc -O hello.c -c

上述程序会自动生成hello.o文件,并且进行优化

3.将链接的函数库填入

[root@master test]# gcc sin.c -lm -L/usr/lib -I/usr/include
  • 在最终链接成二进制可执行文件时,这个命令经常执行
  • -lm 指的是libm.so或libm.a函数库文件
  • -L后面接的路径是函数库的搜索目录。
  • -I后面接的是源码内的include文件所在的目录

4.将编译的结果生成某个特定的文件

gcc -o hello hello.c

5.在编译时,输出较多的信息说明

gcc -o hello hello.c -Wall

加入-Wall之后,程序的编译会变得较为严谨,所以警告信息也会显示出来

通常称-Wall或者-O这些非必要的选项为标志。因为我们使用的是C语言,有时也会简称这些标志为CFLAGS

六.总结

🥇🥇程序写好了接下来做的就是调试程序,程序的调试对于程序员或者Linux管理员来说也是至关重要的。
🥇🥇后期会持续更新我学习Linux以及在运维领域的学习记录,如果本篇文章对你有帮助,恳请大家支多多支持哦~文章来源地址https://www.toymoban.com/news/detail-445666.html

到了这里,关于【Linux】使用gcc调试程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vscode+gcc+jlink调试mcu程序(用于替代IDE)

    几年前写过一篇类似的文章,那时是用于调试rtthread系统:使用 VSCode、arm-none-eabi-gdb、J-Link GDB Server 调试RTThread。 当时有关vscode和gcc调试MCU的文章很少,所以只是写了个大概。 最近又遇到了类似的问题,网上搜了一些资料,发现此方面的内容已经比较成熟了,借鉴了一些资料

    2024年02月13日
    浏览(39)
  • Linux下gcc编译,动态库和静态库,makefile,gdb调试

    展开头文件, 宏替换(变量宏、函数宏)、替换空格等 逐行检查程序中出现的语法错误,简单的逻辑错误 将 .s 汇编文件中所有的汇编指令翻译成二进制机器码(下面就是来了个截图,二进制显示了乱码) 将 .o 的目标文件,链接库文件、数据段合并,地址回填(把汇编里相

    2024年02月08日
    浏览(51)
  • Linux 使用gdb调试C程序

    一、gdb的一些基础命令 l :显示代码 l n :跳转到当前代码页的第n行的代码 l filename.c :n :跳转到filename.c文件的第n行代码 b 行号 :加断点 info break :查看断点信息 delete 断点编号 :删除断点 r ,运行程序 n ,单步执行 c ,继续执行,遇到断点停止执行 p ,打印 s ,进入函数

    2024年02月13日
    浏览(41)
  • 使用vscode + gcc进行 STM32 单片机开发(一)编译及调试

    众所周知,单片机MCU的开发通常是使用keil来进行的,但是keil作为一款有几十年历史的IDE,bug层出不穷,界面也越来越丑,加上使用盗版jlink,导致keil各种崩溃卡死。 故越来越多的单片机IDE也如雨后春笋般冒出,例如 st官方出版的st studio、rt-thread出版的rt-studio,至于好不好用

    2023年04月08日
    浏览(50)
  • Linux开发工具大全 - 软件包管理器yum | vim编辑器 | gcc/g++编译器 | 自动化构建工具Make/Makefile | gdb调试工具

    目录 Ⅰ.  Linux 软件包管理器 yum 一、yum 背景知识 二、yum 的基本使用 1、查看软件包 2、软件包名称构成 3、安装软件 4、卸载软件 Ⅱ.vim编辑器  一、认识vim 1、vim概念  2、模式及其切换  二、vim使用 1、vim的指令(重要)  命令模式 插入模式 底行模式 2、vim配置 Ⅲ.gcc/g++编

    2024年02月05日
    浏览(55)
  • 【Linux】Linux编辑器-gcc/g++使用

    目录 一、背景知识 二、gcc是如何完成的   1、预处理(进行宏替换)   2、编译(生成汇编)   3、汇编(生成机器可识别代码)   4、链接(生成可执行文件或库文件)      4.1、静态库      4.2、动态库      4.3、动静态库的比较  三、gcc常见的选项   计算机是二进制读取文件的,我

    2024年02月05日
    浏览(36)
  • 【Linux】gcc/g++ && gdb 使用

    目录 1,背景知识 2,gcc 如何完成 1,预处理(进行宏替换) 2,编译(生成汇编) 3,汇编(生成机器可识别代码) 4,连接(生成可执行文件或库文件) 5,函数库 7,静态库和动态库 8,gcc 选项 9,gcc 选项记忆 3,Linux调试器-gdb使用 1,背景 2,命令选项 3,list/l 行号 4,list/

    2024年02月04日
    浏览(30)
  • 【Linux】基础开发工具使用 --- gcc

    目录 预处理 编译 汇编 链接 函数库 协助记忆 🧋GCC(GNU Compiler Collection)是由GNU开发的编程语言编译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等。),说那么多就是一个编译器。平时写完的程序就是需

    2024年02月03日
    浏览(47)
  • Linux--编译器-gcc/g++使用

    目录 前言 1.看一段样例  2.程序的翻译过程 1.第一个阶段:预处理 2.第二个阶段:编译 3.第三个阶段:汇编 4.第四个阶段:链接 3.程序的编译为什么是这个样子? 4. 关于编译器 5.链接(动静态链接) 1.首先,我们来看一段样例(见一下) 2.见完之后,我们来看一下程序的翻译

    2024年02月20日
    浏览(64)
  • 【Linux】03 GCC编译器的使用

     在使用gcc编译程序时,编译过程可以简要划分为4个阶段:         预处理、编译、汇编、链接 这个阶段主要处理源文件中的#indef、#include和#define预处理命令; 这里主要是把一些include的头文件和一些宏定义,放到源文件中。 编译命令: gcc  -E  -o  hello.i  hello.c 将经过预处

    2024年01月20日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包