Linux程序的编写、编译、调试方法及make 您所在的位置:网站首页 linux怎么编写c语言程序 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语言专家集中营】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

扫一扫,分享给好友

复制链接分享 评论

发布评论请先 登录

相关推荐

PCB分析常见方法 软件代码有bug,可以通过人工查找,也可以通过编译发现,同时也可以通过代码静态分析工具找到错误或警告.... 的头像 strongerHuang 发表于 03-10 17:55 • 438次 阅读 C语言有哪些语法技巧和功能 C语言常常让人觉得它所能表达的东西非常有限。它不具有类似第一级函数和模式匹配这样的高级功能。但是C非.... 的头像 strongerHuang 发表于 03-10 17:42 • 480次 阅读 c语言嵌入式编程 比较详尽的嵌入式C语言解答和分析 发表于 03-10 14:53 • 2次 阅读 使用GoRK3288库的时候需要用到的语法有哪些呢 使用GoRK3288库的时候需要用到的语法有哪些呢?... 发表于 03-10 06:49 • 30次 阅读 C/C++在线编译器的功能 作为程序员,使用编译器是必备技能,但是从入门到放弃,基本上就是在开发环境安装、配置这一步。。。 的头像 strongerHuang 发表于 03-09 17:52 • 959次 阅读 C语言简单模拟委托与简单模拟反射 函数是C语言的核心概念。主调函数(caller)调用被调函数(callee)是一般的调用关系,如果被.... 的头像 硬件攻城狮 发表于 03-09 17:17 • 686次 阅读 C语言中内存四区模型的本质区别和代码分析 ●数据类型可理解为创建变量的模具:是固定内存大小的别名。 的头像 嵌入式ARM 发表于 03-09 14:45 • 157次 阅读 鲲鹏开发套件DevKit 2.0加速应用迁移 多样性计算时代,跨平台的应用迁移和开发不简单数字经济时代,自动驾驶、智能制造、电子政务、智慧金融等新.... 的头像 华为开发者社区 发表于 03-09 14:14 • 138次 阅读 采用FMDft61t133芯片点亮LED的代码 由于目前本人零时朝8bit单片机方向走所以其内容接下来也是8bit单片机。 的头像 互联网电子设计 发表于 03-09 09:19 • 1287次 阅读 采用FMDft61t133芯片点亮LED的代码 VMA和LMA的基本概念简介与常见问题解析 VMA和LMA的基本概念与常见问题解答 摘要:本文介绍VMA和LMA的基本概念,并针对一些理解过程中的常见疑问做出解... 发表于 03-09 06:45 • 111次 阅读 如何调试TAS5805? 如何调试TAS5805? 发表于 03-09 06:38 • 32次 阅读 如何通过驱动的方式点亮LED灯? 如何通过驱动的方式点亮LED灯? 发表于 03-09 06:34 • 32次 阅读 python私有变量和私有方法 python私有变量和私有方法 1. 下划线妙用 在 Python 中,下划线可是非常推荐使用的符号.... 的头像 python爬虫知识分享 发表于 03-08 16:30 • 343次 阅读 一文详细了解量子密码 被喻为“重要数据保险箱”的安全芯片已经渗入人们生活的方方面面。随着5G、物联网、车联网的迅速发展,为.... 的头像 上海航芯 发表于 03-08 10:32 • 237次 阅读 RK3399 Android 7.1亮度调节的步骤有哪些呢 RK3399 Android 7.1亮度调节的原理是什么? RK3399 Android 7.1亮度调节的步骤有哪些呢? ... 发表于 03-08 09:20 • 268次 阅读 请教大神RK3399-RGA该怎样去使用呢 请教大神RK3399-RGA该怎样去使用呢? 发表于 03-08 09:18 • 283次 阅读 TG6101开发实战:蓝牙开发概述 TG6101开发实战:蓝牙开发 1.概述 TG6101 SDK中使用bluedroid栈(4.0)实现对BR/BLE的开发,其中BR主要应用为... 发表于 03-08 08:43 • 521次 阅读 【1024平头哥开发套件开发体验】- sc5654 高级使用步骤 【1024平头哥开发套件开发体验】- sc5654 高级使用 SC5654语音识别流程介绍 语音转文字:asr使用MIT云 函数:void aui... 发表于 03-08 08:34 • 263次 阅读 RK3399 ffmpeg的编译步骤有哪些 RK3399 ffmpeg的编译步骤有哪些?求解答 发表于 03-08 08:30 • 242次 阅读 YL-236指导书C语言版 YL-236指导书C语言版,方便大赛训练时使用。 发表于 03-07 15:47 • 5次 阅读 HF、HNO3和H2O体系中硅的化学刻蚀实验 本文研究了HF、HNO3和H2O体系中硅的蚀刻动力学作为蚀刻剂组成的函数。蚀刻速率与蚀刻剂组成的三轴.... 发表于 03-07 15:27 • 6次 阅读 HF、HNO3和H2O体系中硅的化学刻蚀实验 分享一些单片机基础入门级的知识 很多在校的大学生或者在岗位想加深自己职业技能的人,都想通过学习单片机来补充自己,以便与不被社会淘汰,.... 发表于 03-07 14:18 • 47次 阅读 分享一些单片机基础入门级的知识 python偏函数和泛型函数详解 python偏函数 假如一个函数定义了多个位置参数,那你每次调用时,都需要把这些个参数一个一个地传递.... 的头像 python爬虫知识分享 发表于 03-03 16:43 • 385次 阅读 单片机存储器的入门知识分享 特殊功能寄存器的概念理解清楚了,单片机的编程就不难了,整个的单片机的存储空间的一个结构图,这也就是我.... 发表于 03-03 10:40 • 32次 阅读 单片机存储器的入门知识分享 python高阶函数详解 python高阶函数 1. map 函数 map 函数,它接收两个参数,第一个参数是一个函数对象(当.... 的头像 python爬虫知识分享 发表于 03-02 16:47 • 163次 阅读 python高阶函数详解 python匿名函数的使用 python匿名函数的使用 匿名函数(英语:anonymous function)是指一类无需定义标.... 的头像 python爬虫知识分享 发表于 03-02 16:42 • 156次 阅读 C语言中枚举精讲分析      在使用带有数字性质的名称时有的时候需要用到枚举的方式进行定义函数名字,按照对应的数字格式来.... 的头像 嵌入式应用开发 发表于 03-02 10:58 • 1685次 阅读 C语言中枚举精讲分析 11个案例讲解python函数参数 函数,在定义的时候,可以有参数的,也可以没有参数。 的头像 python爬虫知识分享 发表于 03-01 16:39 • 219次 阅读 详解python普通函数创建与调用 函数是一种仅在调用时运行的代码块。您可以将数据(称为参数)传递到函数中,然后由函数可以把数据作为结果.... 的头像 python爬虫知识分享 发表于 03-01 16:32 • 216次 阅读 大小端定义与应用场景及C语言中大小端的实现 大端模式:数据的高字节保存在内存的低地址中,数据的低字节保存在内存的高地址中; 的头像 嵌入式应用开发 发表于 02-28 08:52 • 202次 阅读 python列表的详细介绍 python列表 列表(英文名 list),是由一系列元素按顺序进行排列而成的容器。 这里面有两个重.... 的头像 python爬虫知识分享 发表于 02-22 15:14 • 151次 阅读 arduino开发实战指南 arduino开发实战指南 发表于 02-22 14:56 • 52次 阅读 《c#高级编程》第六版pdf c#入门经典第五版由清华大学出版社出版,全面介绍C#编程的基础知识,从该语言本身一直到windows.... 发表于 02-21 14:25 • 35次 阅读 Xilinx SystemVerilog中的基本联合体 在 SystemVerilog 中,联合体只是信号,可通过不同名称和纵横比来加以引用。 其工作方式为.... 的头像 赛灵思 发表于 02-19 19:01 • 143次 阅读 Xilinx SystemVerilog中的基本联合体 一文详细了解单片机的大小端模式   咱们中文中常常提到的大小端的英文名字为“endianness”,英文直译的意思是“字节序”,是内.... 的头像 硬件攻城狮 发表于 02-16 17:44 • 557次 阅读 一文详细了解单片机的大小端模式 为什么要用C语言实现面向对象   不知道有多少人去了解过语言的发展史,早期C语言的语法功能其实比较简单。随着应用需求和场景的变化,.... 的头像 硬件攻城狮 发表于 02-16 16:19 • 357次 阅读 为什么要用C语言实现面向对象 STC8G/STC8H系列MCU的C语言封装库下载 FwLib_STC8 是面向 STC8G/STC8H 系列 MCU 的C语言封装库 发表于 02-15 15:05 • 82次 阅读 一文详细了解数字信号与模拟信号 数电模电是电子信息类专业的专业基础课。但是由于比较难,所以很多人学的并不是很好,今天阿斌就来带大家先.... 的头像 multisim 发表于 02-14 19:23 • 716次 阅读 一文详细了解五种IO模型 五种IO模型包括:阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO。 的头像 硬件攻城狮 发表于 02-14 14:38 • 469次 阅读 一文详细了解五种IO模型 C语言常见内存错误及解决方法   本文将带您了解一些良好的和内存相关的编码实践,以将内存错误保持在控制范围内。内存错误是 C 和 .... 的头像 硬件攻城狮 发表于 02-14 13:10 • 407次 阅读 《C陷阱与缺陷》pdf 《C陷阱与缺陷》pdf 发表于 02-14 11:02 • 57次 阅读 《C语言程序设计》第四版谭浩强 《C语言程序设计》第四版谭浩强 发表于 02-14 10:09 • 124次 阅读 C语言在STM32中的内存分配   num_byte、num_word、num_byte_static和point_heap存储在内.... 的头像 硬件攻城狮 发表于 02-10 14:57 • 479次 阅读 C语言在STM32中的内存分配 C语言495例 C语言的常用程序的例子集合 发表于 02-10 09:55 • 34次 阅读 单片机入门必知 | C与单片机C不一样? 单片机c语言比起普通C语言增加了一些基本的指令,变量的赋值是16进制,当然单片机c语言只牵涉到普通c.... 发表于 02-09 11:18 • 23次 阅读 单片机入门必知 | C与单片机C不一样? 学习单片机C语言,必知的数据存储与程序编写知识! 内存分成5个区,它们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 发表于 02-09 10:15 • 15次 阅读 学习单片机C语言,必知的数据存储与程序编写知识! C语言开发单片机为什么大多数都采用全局变量的形式? 全局变量简直就是嵌入式系统的戈兰高地。冲突最激烈的双方是:1. 做控制的工程师, 2. 做非嵌入式的.... 发表于 02-09 09:54 • 19次 阅读 C语言开发单片机为什么大多数都采用全局变量的形式? 【干货】单片机常用的14个C语言算法 算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数.... 发表于 02-09 09:46 • 14次 阅读 【干货】单片机常用的14个C语言算法 单片机C语言如何产生随机数 随机数在单片机的应用中也是很多的,当然产生随机数的方法有很多,当中有一个就是利用单片机定时器,取出未.... 发表于 02-08 17:12 • 50次 阅读 单片机C语言如何产生随机数 学习单片机C语言,必知的数据存储与程序编写知识! 内存分成5个区,它们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 发表于 02-08 16:51 • 15次 阅读 学习单片机C语言,必知的数据存储与程序编写知识! C指针加1引发的思考 1. 问题背景 最近有小伙伴对于 C 语言中指针的运算有点疑问:指针变量加 1 之后,到底向后偏移了.... 发表于 01-26 10:07 • 36次 阅读 《EXCEL函数使用大全》张小峰编 《EXCEL函数使用大全》张小峰编 发表于 01-21 16:11 • 61次 阅读 智能家居系统设计(监测+控制) 智能家居系统模型设计引言实现的功能硬件选型主控模块无线通信模块数据采集模块温湿度监测空气质量监测光照.... 发表于 01-18 11:23 • 62次 阅读 智能家居系统设计(监测+控制) 学习笔记(08):单片机到底是个什么东西-1.2.第1季第2部分-1.2.6.外设与内部外设 本课程是《朱有鹏老师单片机完全学习系列课程》第1季第2个课程,用通俗易懂的语言讲了很多和单片机有关的.... 发表于 01-18 11:14 • 43次 阅读 学习笔记(08):单片机到底是个什么东西-1.2.第1季第2部分-1.2.6.外设与内部外设 时间片轮询+状态机实现裸机多任务 时间片+状态机实现裸机伪多任务注:上述伪多任务是按个人理解命名的,实际上在裸机中跑的还是单线程,只是.... 发表于 01-18 10:37 • 76次 阅读 时间片轮询+状态机实现裸机多任务


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有