Linux编程GCC命令Makefile文件编写

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux编程概述

Linux的编程语言 开发过程 Linux开发工具
Linux的编程语言

基本语言

C、C++、Java……

脚本语言

ຫໍສະໝຸດ Baidu
Perl、PHP、Bash……
开发过程
对源代码进行编辑,VI
编辑
编译 链接
运行编译好的程序 ./+目标文件名
对源代码编译,生成目标 程序,GCC
Linux程序设计 GCC与MAKEFILE 李英娜
目录


回顾上节,挂接外存储设备 Linux编程概述 GCC Makefile 课程实践
熟练二个命令

ls
查看文件和目录
-a 全部的文件目录列表 -h 容量明显化表示 -l 详细列表 -R 递归目录列表 -S 按容量大小排序 -t 时间排序 -r 排序结果反序输出
1/2
编译为目标文件,不连接库 编译为汇编代码 预处理.预处理之后的代码将送往标准输出 -Wwarn... 设置警告,可以设置的警告开关很多,通常用Wall开启所有的警告 -O level :设置优化级别,level可以是0,1,2,3或者s,默认为O0,即不进行优化处理. -Dname=definition: 在命令行上定义宏,有两种方式,Dname或者-Dname=definition. 在命令行上设置宏定义的目 的主要是为了在调试的时候设定一些开关,而在发布的时候 再关闭或者打开这些开关即可,当然宏定义也用来对代码进 行有选择地编译.另外也还有其他的一些作用.
Gcc的错误类型及对策

Gcc的错误类型及对策

第四类∶未定义符号 错误资讯∶有未定义的符号(Undefined symbol)。这类错误是在 连接过程中出现的,可能有两种原因∶一是使用者自己定义的函 数或者全局变量所在源代码文件,没有被编译、连接,或者干脆 还没有定义,这需要使用者根据实际情况修改源程序,给出全局 变量或者函数的定义体;二是未定义的符号是一个标准的库函数, 在源程序中使用了该库函数,而连接过程中还没有给定相应的函 数库的名称,或者是该档案库的目录名称有问题,这时需要使用 档案库维护命令ar检查我们需要的库函数到底位于哪一个函数库 中,确定之后,修改gcc连接选项中的-l和-L项。
简介

4/4
GCC的特点

支持多种编程语言

-C/C++/Fortan/JAVA……

可移植性强:主要采用C语言编写 交叉支持能力强

Build, host and target参数 --build=编译该软件所使用的平台 --host=该软件将运行的平台 --target=该软件所处理的目标平台 X86/ia/MIPS/ARM/SPARC/…… 高性能计算、商用服务器、PC、嵌入式系统 前端+中间表示|后端,松耦合
小实例

小实例




从程序员的角度看,只需简单执行一条 GCC 命令就可以了,但从编 译器的角度来看,却需要完成一系列非常繁杂的工作。首先, GCC 调用 预处理程序 cpp ,由它负责展开在源文件中定义的宏,并向其中插入 include 语句所包含的内容;接着, GCC 会调用 ccl 和 as 将处理后 的源代码编译成目标代码;最后, GCC 会调用链接程序 ld ,把生成的 目标代码链接成一个可执行程序。 为了更好地理解 GCC 的工作过程,可以把上述编译过程分成几个步 骤单独进行,并观察每步的运行结果。第一步是进行预编译,使用 -E 参数可以让 GCC 在预处理结束后停止编译过程: # gcc -E hello.c -o hello.i 此时若查看 hello.i 文件中的内容,会发现 stdio.h 的内容确实 都插到文件里去了,而其它应当被预处理的宏定义也都做了相应的处理。 下一步是将 hello.i 编译为目标代码,这可以通过使用 -c 参数来完成: # gcc -c hello.i -o hello.o GCC 默认将 .i 文件看成是预处理后的 C 语言源代码,因此上述命 令将自动跳过预处理步骤而开始执行编译过程,也可以使用 -x 参数让 GCC 从指定的步骤开始编译。最后一步是将生成的目标文件链接成可执 行文件:




1984,FSF建立,GNU Project:开放系统支撑软件 1985,GCC项目启动 1987,GCC 1.0 release,C compiler 1991,Linux项目开始发布 1992,GCC2.0 release,C/C++ 1994,Linux1.0 release 1997,EGCS。Architecture Related Optimization and C++ support 2001, GCC3.0 release,EGCS Merged,Multi Languages/targets 2005, GCC4.0 release,IR Enhanced 2007, GCC4.2 release,OpenMP support
Gcc的错误类型及对策

Gcc的错误类型及对策

Gcc编译器如果发现源程序中有错误,就无法继续进行,也无法生 成最终的可执行文件。为了便于修改,gcc给出错误资讯,我们必 须对这些错误资讯逐个进行分析、处理,并修改相应的语言,才 能保证源代码的正确编译连接。gcc给出的错误资讯一般可以分为 四大类,下面我们分别讨论其产生的原因和对策。
Gcc的错误类型及对策

Gcc的错误类型及对策

第三类∶档案库错误 错误资讯∶连接程序找不到所需的函数库,例如∶ ld: -lm: No such file or directory 这类错误是与目标文件相连接的函数库有错误,可能的原因是函 数库名错误、指定的函数库所在目录名称错误等,检查的方法是 使用find命令在可能的目录中寻找相应的函数库名,确定档案库 及目录的名称并修改程序中及编译选项中的名称。
小实例

小实例



在学习使用 GCC 之前,下面的这个例子能够帮助各位迅 速理解 GCC 的工作原理,并将其立即运用到实际的项目 开发中去。首先用熟悉的编辑器输入所示的代码: hello.c # include <stdio.h> int main() { printf("Hello world, Linux programming!\n"); return 0; } 然后执行下面的命令编译和运行这段程序: # gcc hello.c -o hello # ./hello Hello world, Linux programming!

编译工具

GCC
目录

Linux编程概述


GCC
Makefile 课程实践
GCC


简介 基本规则 常用参数 实例分析
简介

1/3
GCC概述

gcc是一个强大的工具集合,它包含了预处理器,编译 器,汇编器,链接器等组件。它会在需要的时候调用其
他组件。输入文件的类型和传递给gcc的参数决定了gcc
GCC常用参数介绍
-Uname
1/2
取消宏定义name,作用和上面的正好相反. -Idir... 把dir加到头文件的搜索路径中,而且gcc会在搜索标 准头文件之前先搜索dir. -llibrary 在连接的时候搜索library库.库是一些archieve文件 --其成员是目标文件.如果有文件引用library, library在命令 行的位置应该在那个文件之后,因此,越底层的库越要放在后 面.比如如果你要连接pcap库,那么你就需要使用-lpcap对源 文件进行编译. -Ldir... 把dir加到库文件的搜索路径中,而且gcc会在搜索标 准库文件之前先搜索dir. -g 产生调试信息. GDB能够使用这些调试信息。 -o outfile 指定输出文件的文件名,默认为a.out
使用光盘和U盘?(2)

光盘
物理光驱 ISO文件(虚拟机提供选择) mount /mnt/cdrom; cd /mnt/cdrom; ls umount /mnt/cdrom
U盘 Linux将U盘当做SCSI设备 fdisk –l mkdir /mnt/usb mount -t vfat /dev/sdb1 /mnt/usb cd /mnt/usb; ls
将分散的模块组成一个可 执行的整体
运行 调试
调试运行时的错误 GDB
链接

--- continue
函数库分为静态库和动态库。

静态库:链接时,静态库的文件代码会被拷贝
到可执行文件中。

动态库:链接时,动态库的代码不会被加入可
执行文件中,而是在程序被执行的时候加载。
Linux开发工具

编辑工具

VI
调用具体的哪些组件。对于开发者,它提供的足够多的 参数,可以让开发者全面控制代码的生成,这对嵌入式
系统级的软件开发非常重要

他可以处理C、C++、Fortan、Pascal、Objective-C、 Java、Ada等。
简介
2/4
• 在该阶段,编译器分析处理源代码文件中的各种宏指令, 预处理 如#include,#if等。
小实例





# gcc hello.o -o hello 在采用模块化的设计思想进行软件开发时,通常整个程序是由多个源文件组 成的,相应地也就形成了多个编译单元,使用 GCC 能够很好地管理这些编译单元。 假设有一个由 foo1.c 和 foo2.c 两个源文件组成的程序,为了对它们进行编译, 并最终生成可执行程序 foo ,可以使用下面这条命令: # gcc foo1.c foo2.c -o foo 如果同时处理的文件不止一个, GCC 仍会按照预处理、编译和链接的过程依 次进行。如果深究起来,上面这条命令大致相当于依次执行如下三条命令: # gcc -c foo1.c -o foo1.o # gcc -c foo2.c -o foo2.o # gcc foo1.o foo2.o -o foo 在编译一个包含许多源文件的工程时,若只用一条 GCC 命令来完成编译是非 常费时的。假设项目中有100个源文件需要编译,并且每个源文件中都包含10000 行代码,如果像上面那样仅用一条 GCC 命令来完成编译工作,那么 GCC 需要将 每个源文件都重新编译一遍,然后再全部连接起来。很显然,这样浪费的时间相 当多,尤其是当用户只是修改了其中某一个文件的时候,完全没有必要将每个文 件都重新编译一遍,因为很多已经生成的目标文件是不会改变的。要解决这个问 题,关键是要灵活运用 GCC ,同时还要借助像 Make 这样的工具。
Gcc的错误类型及对策

Gcc的错误类型及对策

第二类∶头文件错误 错误资讯∶找不到头文件head.h(Can not find include file head.h)。这类错误是源代码文件中的包含头文件有问题,可能的 原因有头文件名错误、指定的头文件所在目录名错误等,也可能 是错误地使用了双引号和尖括号。

处理器支持多


应用范围广


模块化设计

基本规则

GCC的命令格式

gcc [options] infile….

.c为后缀的文件,C语言源代码文件; .o为后缀的文件,是编译后的目标文件 .s为后缀的文件,是汇编语言源代码文件;
GCC常用参数介绍
常用选项: -c -S -E
cd
改变目录
在虚拟机中使用光盘和U盘?(1)

挂载
linux操作系统将所有的设备都看作文件,将整个计算 机的资源都整合成一个大的文件目录 。挂载就是将一个设 备(通常是存储设备)挂接到一个已存在的目录上。
命令形式:mount [-t vfstype] [-o options] device dir
• 在该阶段,GCC首先要检查代码的规范性、是否有语法 错误等,在检查无误后,GCC把代码翻译为汇编语言。 • 在该阶段,编译器把编译生成的汇编代码转成二进制目 标代码
编译
汇编
链接
• 在该阶段,编译器把汇编阶段生成的二进制代码、程序 中用到的库文件链接起来,生成可执行文件。
简介

3/4
GCC的历史
Gcc的错误类型及对策

Gcc的错误类型及对策

第一类∶C语法错误 错误资讯∶文件source.c中第n行有语法错误(syntex errror)。 这种类型的错误,一般都是C语言的语法错误,应该仔细检查源代 码文件中第n行及该行之前的程序,有时也需要对该文件所包含的 头文件进行检查。有些情况下,一个很简单的语法错误,gcc会给 出一大堆错误,我们最主要的是要保持清醒的头脑,不要被其吓 倒,必要的时候再参考一下C语言的基本教材。
相关文档
最新文档