Linux程序的编写、编译、调试方法及make

您所在的位置:网站首页 linux怎么编译文件 Linux程序的编写、编译、调试方法及make

Linux程序的编写、编译、调试方法及make

#Linux程序的编写、编译、调试方法及make| 来源: 网络整理| 查看: 265

1.建一个目录

2.写代码,建一个hello.c文件

代码:

view plaincopy to clipboard

#include"stdio.h"

main()

{

printf("HelloLinux.\n")

}

#include"stdio.h"

main()

{

printf("Hello Linux.\n")

}

记得最后一定要换行

3.编译

gcc-ohellohello.c

使用gcc编译器就会为我们生成一个hello的可执行文件

4.输出

执行./hello就可以看到程序的输出结果了.

是不是很简单?

命令行中gcc表示我们是用gcc来编译我们的源程序,-o选项表示我们要求编译器给我们输出的可执行文件名为hello而hello.c是我们的源程序文件.gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了.-o选项我们已经知道了,表示我们要求输出的可执行文件名.-c选项表示我们只要求编译器输出目标代码,而不必要输出可执行文件.-g选项表示我们要求编译器在编译的时候提供我们以后对程序进行调试的信息.知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你想要知道更多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说明.

下面我们来演示怎样用GDB来调试一个求0+1+2+3+…+99的程序:

/* Filename:hello.c */ #include "stdio.h"main(){int i, sum;sum = 0;for (i = 0; i

执行如下命令编译hello.c(加-g选项产生debug信息):#gcc –g –ohello sum.c在命令行上键入gdb hello并按回车键就可以开始调试sum了,再运行run命令执行sum

#gdb hello

list命令用于列出源代码,对上述程序两次运行list,将出现如上画面(源代码被标行号)。

根据列出的源程序,如果我们将断点设置在第5行,只需在gdb 命令行提示符下键入如下命令设置断点:(gdb) break 5

设置断点的另一种语法是 break ,它在进入指定函数(function)时停住。相反的,clear用于清除所有的已定义的断点,clear 清除设置在函数上的断点, clear 则清除设置在指定行上的断点。watch命令:watch命令用于观查变量或表达式的值,我们观查sum变量只需要运行watch sum

watch 为表达式(变量)expr设置一个观察点,一量表达式值有变化时,程序会停止执行。要观查当前设置的watch,可以使用info watchpoints命令。next、step命令:next、step用于单步执行,在执行的过程中,被watch变量的变化情况将实时呈现(分别显示Old value和New value)

next、step命令的区别在于step遇到函数调用,会跳转到到该函数定义的开始行去执行,而next则不进入到函数内部,它把函数调用语句当作一条普通语句执行。

5.Make make是所有想在Linux系统上编程的用户必须掌握的工具,对于任何稍具规模的程序,我们都会使用到make,几乎可以说不使用make的程序不具备任何实用价值。 在此,我们有必要解释编译和连接的区别。编译器使用源码文件来产生某种形式的目标文件(object files),在编译过程中,外部的符号参考并没有被解释或替换(即外部全局变量和函数并没有被找到)。因此,在编译阶段所报的错误一般都是语法错误。而连接器则用于连接目标文件和程序包,生成一个可执行程序。在连接阶段,一个目标文件中对别的文件中的符号的参考被解释,如果有符号不能找到,会报告连接错误。 编译和连接的一般步骤是:第一阶段把源文件一个一个的编译成目标文件,第二阶段把所有的目标文件加上需要的程序包连接成一个可执行文件。这样的过程很痛苦,我们需要使用大量的gcc命令。 而make则使我们从大量源文件的编译和连接工作中解放出来,综合为一步完成。GNU Make的主要工作是读进一个文本文件,称为makefile。这个文件记录了哪些文件(目的文件,目的文件不一定是最后的可执行程序,它可以是任何一种文件)由哪些文件(依靠文件)产生,用什么命令来产生。Make依靠此makefile中的信息检查磁盘上的文件,如果目的文件的创建或修改时间比它的一个依靠文件旧的话,make就执行相应的命令,以便更新目的文件。 假设我们写下如下的三个文件,add.h用于声明add函数,add.c提供两个整数相加的函数体,而main.c中调用add函数:

/* filename:add.h */extern int add(int i, int j);/* filename:add.c */int add(int i, int j){return i + j;}/* filename:main.c */#include "add.h"main(){int a, b;a = 2;b = 3;printf("the sum of a+b is %d", add(a + b));}

怎样为上述三个文件产生makefile呢?如下:

test : main.o add.ogcc main.o add.o -o testmain.o : main.c add.hgcc -c main.c -o main.oadd.o : add.c add.hgcc -c add.c -o add.o

上述makefile利用add.c和add.h文件执行gcc -c add.c -o add.o命令产生add.o目标代码,利用main.c和add.h文件执行gcc -c main.c -o main.o命令产生main.o目标代码,最后利用main.o和add.o文件(两个模块的目标代码)执行gcc main.o add.o -o test命令产生可执行文件test。我们可在makefile中加入变量,另外。环境变量在make过程中也被解释成make的变量。这些变量是大小写敏感的,一般使用大写字母。Make变量可以做很多事情,例如:i) 存储一个文件名列表;ii) 存储可执行文件名;iii) 存储编译器选项。要定义一个变量,只需要在一行的开始写下这个变量的名字,后面跟一个=号,再跟变量的值。引用变量的方法是写一个$符号,后面跟(变量名)。我们把前面的 makefile 利用变量重写一遍(并假设使用-Wall -O –g编译选项):

OBJS = main.o add.oCC = gccCFLAGS = -Wall -O -gtest : $(OBJS)$(CC) $(OBJS) -o testmain.o : main.c add.h$(CC) $(CFLAGS) -c main.c -o main.oadd.o : add.c add.h$(CC) $(CFLAGS) -c add.c -o add.o

makefile 中还可定义清除(clean)目标,可用来清除编译过程中产生的中间文件,例如在上述makefile文件中添加下列代码:

clean:rm -f *.o

运行make clean时,将执行rm -f *.o命令,删除所有编译过程中产生的中间文件。 不管怎么说,自己动手编写makefile仍然是很复杂和烦琐的,而且很容易出错。因此,GNU也为我们提供了Automake和Autoconf来辅助快速自动产生makefile,读者可以参阅相关资料。 7.小结 本章主要阐述了Linux程序的编写、编译、调试方法及make,实际上就是引导读者学习怎样在Linux下编程,为后续章节做好准备。

原文标题:Linux下用C语言最基本的程序开发与调试

文章出处:【微信号:C_Expert,微信公众号:C语言专家集中营】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

扫一扫,分享给好友

复制链接分享 评论

发布评论请先 登录

相关推荐

C语言常见问题 C语言常见问题 发表于 03-21 14:57 • 1次 阅读 如何从RGBD相机提取像素的深度信息 灰度是描述灰度图像内容的最直接的视觉特征。它指黑白图像中点的颜色深度,范围一般从0到255,白色为2.... 的头像 机器视觉智能检测 发表于 03-21 13:37 • 101次 阅读 如何将前中后序的递归框架改写成迭代形式 之前经常讲涉及递归的算法题,我说过写递归算法的一个技巧就是不要试图跳进递归细节,而是从递归框架上思考.... 的头像 算法与数据结构 发表于 03-18 10:13 • 79次 阅读 修改rt_kprintf()函数成为中断方式需要注意什么地方 使用rt-thread-0.2.4版本,在MDK上软件仿真调试STM32F101RB。 初始化USART2工作在中断发送方式,使用消息队列方式... 发表于 03-18 09:27 • 1245次 阅读 RISC-V GNU编译器工具链 这是RISC-V C和 C++交叉编译器。它支持两种构建模式:通用ELF/Newlib工具链和更复杂.... 发表于 03-17 16:36 • 16次 阅读 第九章 AVR C语言的应用.PDF 本教程讲解的是AVR C语言编程,包括开发环境、语言语法、特殊用法基础知识的讲解 发表于 03-17 14:21 • 14次 阅读 S7-1200 PLCSIM支持范围 S7-PLCSIM 几乎支持仿真的 S7-1200 和 S7-1200F 的所有指令(系统函数和系统.... 的头像 机器人及PLC自动化应用 发表于 03-17 10:14 • 163次 阅读 i.MX6ULL驱动开发2—新字符设备开发模板 上篇文章介绍了字符设备的开发模板,但那是一种旧版本的驱动开发模式,设备驱动需要手动分配设备号再使用 .... 的头像 码农爱学习 发表于 03-17 09:11 • 1469次 阅读 i.MX6ULL驱动开发2—新字符设备开发模板 单片机字符串转各种位宽的函数 十进制数值字符串转各种位宽的整形数据demo 本demo实现了字符串转各种位宽的函数,代码简单效率高,非常适合单片机嵌入式应用。... 发表于 03-16 23:51 • 1057次 阅读 GH集成开发环境和编译器 说实话,以前也用过正版的编译器,我记得之前用过正版的IAR编译器license也没有多贵,而最近用了.... 的头像 嵌入式程序猿 发表于 03-16 17:08 • 309次 阅读 stm32中常用关键字的使用方法 extern,可以在一个文件中引用另一个文件中定义的变量或者函数,下面就结合具体的实例。 的头像 嵌入式应用开发 发表于 03-16 16:35 • 329次 阅读 从yield开始入门python协程 本篇文章会先向你介绍一个陌生的 Python 关键词,他和 return 就像一对新兄弟,有相似之处.... 的头像 python爬虫知识分享 发表于 03-16 16:20 • 220次 阅读 python创建线程池的两种方法 在使用多线程处理任务时也不是线程越多越好,由于在切换线程的时候,需要切换上下文环境,依然会造成cpu.... 的头像 python爬虫知识分享 发表于 03-16 16:15 • 212次 阅读 时间序列分析和预测基础理论知识 今天给大家带来一篇实战案例,本案例旨在运用之前学习的时间序列分析和预测基础理论知识,用一个基于交通数.... 的头像 数据分析与开发 发表于 03-16 14:05 • 152次 阅读 重复值处理的常用方法 重复值处理主要涉及两个部分,一个是找出重复值,第二个是删除重复值,也就是根据自己设定的条件进行删除操.... 的头像 数据分析与开发 发表于 03-16 13:55 • 157次 阅读 详解golang事务的三种写法 本文中作者展示了 golang 事务的三种写法。 的头像 马哥Linux运维 发表于 03-16 08:52 • 176次 阅读 为什么说C语言程序运行时要比其他语言编写的程序快得多 C语言程序运行时要比其他语言编写的程序快得多,因为它“离底层机器很近”,这个说法正确吗? 的头像 C语言编程学习基地 发表于 03-16 08:45 • 140次 阅读 C语言如何使用正则表达式 C语言的正则表达式规则,特此跟大家分享。 的头像 C语言编程学习基地 发表于 03-16 08:41 • 169次 阅读 VScode编译器如何配置C/C++编译环境 昨天有伙伴私信我,为什么我用C语言写的hello world几行代码,在编译器里面报错了呢? 的头像 C语言编程学习基地 发表于 03-16 08:38 • 135次 阅读 Pandas profiling数据库的功能及解决方案 Pandas profiling 可以弥补 pandas describe 没有详细数据报告生成的不.... 的头像 数据分析与开发 发表于 03-15 16:31 • 338次 阅读 单片机实现24C02存储上次使用中状态的C语言实例 单片机实现24C02存储上次使用中状态的C语言实例 发表于 03-15 14:19 • 27次 阅读 Verilog逻辑设计中的循环语句和运算符 “ 本文主要分享了在Verilog设计过程中一些经验与知识点,主要包括循环语句(forever、re.... 的头像 FPGA之家 发表于 03-15 11:41 • 187次 阅读 兆声清洗晶片过程中去除力的分析 在半导体器件的制造过程中,兆声波已经被广泛用于从硅晶片上去除污染物颗粒。在这个过程中,平面硅片被浸入.... 发表于 03-15 11:28 • 2次 阅读 兆声清洗晶片过程中去除力的分析 函数模板与类模板的基本概念及实现原理 [导读] 最近使用C++做些编程,把日常遇到的些比较重要的概念总结分享一下。本文来分享一下模板类的原.... 的头像 FPGA之家 发表于 03-15 11:21 • 157次 阅读 AbsInt代码安全性能分析套件产品介绍 德国AbsInt公司是专注于安全苛求软件研发、确认、验证和认证的工具链供应商。能够为客户提供较完整的.... 的头像 经纬恒润 发表于 03-14 15:32 • 234次 阅读 一种软件模拟内核复位的方法 说到复位,我们都不会陌生,对于一个MCU系统,复位电路是必不可少的一部分。复位的种类有很多:上电复位.... 的头像 中颖电子 发表于 03-14 12:04 • 219次 阅读 一种软件模拟内核复位的方法 25个Pandas实用技巧 假设你将一些数据储存在Excel或者Google Sheet中,你又想要尽快地将他们读取至DataF.... 的头像 数据分析与开发 发表于 03-14 10:33 • 139次 阅读 C语言使用回调函数模拟委托与反射 函数是C语言的核心概念。主调函数(caller)调用被调函数(callee)是一般的调用关系,如果被.... 的头像 STM32嵌入式开发 发表于 03-14 10:19 • 139次 阅读 博途V13-调用GRAPH顺控器实例说明 在以下部分中,将在组织块“Main” 中调用 GRAPH FB“GRAPH_Sequence” 并为.... 的头像 机器人及PLC自动化应用 发表于 03-14 09:59 • 146次 阅读 rt-thread 启动初始化时报错怎么办 hard fault on handler rt-thread 启动初始化时报错hard fault on handler,只知道是在(*fn_ptr)();调用初始化函数出错,板子换... 发表于 03-14 09:43 • 1280次 阅读 如何使用BERT模型进行抽取式摘要   最近在梳理文本摘要相关内容,翻到一篇19年关于基于BERT模型进行抽取式摘要的老文「BertSu.... 的头像 深度学习自然语言处理 发表于 03-12 16:41 • 1441次 阅读 如何使用BERT模型进行抽取式摘要 第一个C语言编译器的来源 不知道你有没有想过,某种编程语言的第一个编译器是怎么来的呢?这不就是“鸡生蛋,蛋生鸡”的问题吗? 的头像 嵌入式ARM 发表于 03-12 12:36 • 676次 阅读 详解C语言中的短路现象   C语言一经出现,就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语.... 的头像 嵌入式ARM 发表于 03-12 12:23 • 575次 阅读 详解C语言中的短路现象 如何快速学习并精通C语言 学习C语言不是一朝一夕的事情,但也不需要花费十年时间才能精通。如何以最小的代价学习并精通C语言是本文.... 的头像 嵌入式ARM 发表于 03-12 11:59 • 430次 阅读 编写一个简单的C51程序 对于嵌入式系统,如果没有运行RTOS,那么程序开发中的 主函数(main())需要通过某种机制使其永.... 的头像 嵌入式ARM 发表于 03-12 11:17 • 392次 阅读 C语言操作寄存器的常见手法 使用C语言对寄存器赋值时,常常需要用到C语言的位操作方法。把寄存器某位清零 假设a代表寄存器,.... 的头像 硬件攻城狮 发表于 03-12 09:06 • 210次 阅读 如何应用Material Design 3和Material You   Material You 是下一代 Material Design 的发展方向,也是一种全新的设.... 的头像 谷歌开发者 发表于 03-11 10:24 • 229次 阅读 ​为什么嵌入式开发要选择C语言? 简洁紧凑,使用灵活的语法机制,并能直接访问硬件能够直接访问硬件的语言有:汇编和C语言汇编属于低级语言.... 的头像 硬件攻城狮 发表于 03-11 10:21 • 170次 阅读 PCB分析常见方法 软件代码有bug,可以通过人工查找,也可以通过编译发现,同时也可以通过代码静态分析工具找到错误或警告.... 的头像 strongerHuang 发表于 03-10 17:55 • 824次 阅读 C语言有哪些语法技巧和功能 C语言常常让人觉得它所能表达的东西非常有限。它不具有类似第一级函数和模式匹配这样的高级功能。但是C非.... 的头像 strongerHuang 发表于 03-10 17:42 • 820次 阅读 c语言嵌入式编程 比较详尽的嵌入式C语言解答和分析 发表于 03-10 14:53 • 451次 阅读 使用GoRK3288库的时候需要用到的语法有哪些呢 使用GoRK3288库的时候需要用到的语法有哪些呢?... 发表于 03-10 06:49 • 499次 阅读 C/C++在线编译器的功能 作为程序员,使用编译器是必备技能,但是从入门到放弃,基本上就是在开发环境安装、配置这一步。。。 的头像 strongerHuang 发表于 03-09 17:52 • 3367次 阅读 C语言简单模拟委托与简单模拟反射 函数是C语言的核心概念。主调函数(caller)调用被调函数(callee)是一般的调用关系,如果被.... 的头像 硬件攻城狮 发表于 03-09 17:17 • 3096次 阅读 C语言中内存四区模型的本质区别和代码分析 ●数据类型可理解为创建变量的模具:是固定内存大小的别名。 的头像 嵌入式ARM 发表于 03-09 14:45 • 256次 阅读 VMA和LMA的基本概念简介与常见问题解析 VMA和LMA的基本概念与常见问题解答 摘要:本文介绍VMA和LMA的基本概念,并针对一些理解过程中的常见疑问做出解... 发表于 03-09 06:45 • 611次 阅读 如何调试TAS5805? 如何调试TAS5805? 发表于 03-09 06:38 • 67次 阅读 如何通过驱动的方式点亮LED灯? 如何通过驱动的方式点亮LED灯? 发表于 03-09 06:34 • 202次 阅读 RK3399 Android 7.1亮度调节的步骤有哪些呢 RK3399 Android 7.1亮度调节的原理是什么? RK3399 Android 7.1亮度调节的步骤有哪些呢? ... 发表于 03-08 09:20 • 316次 阅读 RK3399 ffmpeg的编译步骤有哪些 RK3399 ffmpeg的编译步骤有哪些?求解答 发表于 03-08 08:30 • 279次 阅读


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3