1,
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需 要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
2,
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。 make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的 make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
3,
Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。
4,下面给出一个简单的实例:
file1.h
#ifndef MYFUN_H_INCLUDED
#define MYFUN_H_INCLUDED
extern void func1();
extern int h1;
#endif // MYFUN_H_INCLUDED
file1.c
#include <stdio.h>
int h1=10;
void func1()
{
printf("head file function.\n");
}
main.c
#include <stdio.h>
#include "file1.h"
int main()
{
printf("%d\n",h1);
func1();
return 0;
}
依赖关系就是main需要用到头文件file1.h.
makefile可以这么写(注意:命令前必须是tab,否则出现遗漏错误)
my.out : file1.o main.o
cc file1.o main.o -o my.out
file1.o : file1.c
cc -c file1.c
main.o : main.c file1.h
cc -c main.c
5,常用的gcc命令:
cc -c main.c
//生成目标模块
cc main.o -o my.out
//连接器将目标模块组合成一个可执行程序
-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件
-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。
6,GCC执行过程示例
示例代码 a.c:
#include <stdio.h>
int main()
{
printf("hello\n");
}
(1)预编译过程:
这个过程处理宏定义和include,并做语法检查。
可以看到预编译后,代码从5行扩展到了752行。
gcc -E a.c -o a.i
cat a.c | wc -l
5
cat a.i | wc -l
752
(2)编译过程:
这个阶段,生成汇编代码。
gcc -S a.i -o a.s
cat a.s | wc -l
25
(3)汇编过程:
这个阶段,生成目标代码。
此过程生成ELF格式的目标代码。
as a.s -o a.o
file a.o
a.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped
(4)链接过程:
链接过程。生成可执行代码。链接分为两种,一种是静态链接,另外一种是动态链接。使用静态链接的好处是,依赖的动态链接库较少,对动态链接库的版本不会很敏感,具有较好的兼容性;缺点是生成的程序比较大。使用动态链接的好处是,生成的程序比较小,占用较少的内存。
gcc a.o -o a.out
程序运行:
./a.out
hello
分享到:
相关推荐
总结来说,这个压缩包文件提供了一个关于如何使用GCC和MakeFile进行DLL编译的入门实例。通过学习和实践这个例子,开发者可以掌握C++源码的编译过程,了解MakeFile的编写,以及如何在Windows上创建和使用DLL。这是一...
在编程世界中,`Makefile` 是一个至关重要的工具,特别是在多文件项目中,它用于自动化编译和链接过程,节省了开发者的时间和精力。`Makefile` 的编写是项目构建自动化的核心,它定义了一系列规则,告诉操作系统如何...
下面是一个简单的交叉编译实例。首先,我们编写一个main.c文件,然后使用GCC编译生成可执行文件。然后,我们将这个可执行文件放到目标板上运行。结果发现,编译生成的可执行文件不能在目标板上运行。这是因为GCC...
下面是一个简单的Makefile实例,编译六个源文件和六个头文件: ``` func1.c: func1.o gcc -c func1.c -o func1.o func2.c: func2.o gcc -c func2.c -o func2.o func3.c: func3.o gcc -c func3.c -o func3.o func...
### makefile实例讲解 #### 为什么学习makefile 在IT行业,尤其是软件开发领域,makefile扮演着举足轻重的角色。它不仅是一种自动化构建工具的配置文件,更是衡量一个开发者能否有效管理与构建大型项目的重要标准...
在这个"makefile实例"中,我们将会探讨`Makefile`的基本结构、常用指令以及如何使用它来管理和构建项目。 `Makefile`的核心是规则,每个规则通常由目标(target)、依赖项(dependencies)和命令(commands)组成。...
GCC编译器是Linux系统下的一个重要工具,用于编译C/C++代码。GCC编译器的编译过程分为四个阶段:预处理、编译、汇编和链接。预处理阶段将源代码转换为中间代码,编译阶段将中间代码转换为汇编代码,汇编阶段将汇编...
这个Makefile是一个用于编译C语言程序的简单示例。下面是对Makefile中各个部分的解释: 编译器设置:CC = gcc 指定了使用的编译器是gcc。 编译选项:CFLAGS = -Wall -Wextra -g 定义了编译时使用的选项,包括开启...
在提供的示例代码中,我们有一个简单的C语言项目结构,包括`main.c`、`mytool1.c`、`mytool1.h`、`mytool2.c`、`mytool2.h`等文件,以及一个名为`Makefile`的构建脚本。下面将逐一分析这些文件,并解释它们是如何...
用shell脚本写成的gcc简单使用。 其中涉及到5个文件:(1)6.sh为由一个菜单选择各种功能——可以演示编译c程序的过程以及静态与动态函数库的生成及使用。(2)endian.c为一个简单的C函数用于识别机器的内存大小端。...
autoconf automake实例gcc编译java方法.txt,gcc的组件和软件工具 .txt,gcc库.txt,gdb自己总结.txt,linux 下gcc 编程.ppt,linux下JAVA环境设置.pdf,Vi指令大全.htm,跟我一起写 Makefile.pdf
本文将围绕"一个makefile标准工程"的主题,结合具体的Audio-Makefile实例,深入探讨Makefile的核心概念、结构以及如何编写和使用Makefile。 一、Makefile基础 Makefile是构建程序的一种规则集合,它定义了目标文件...
### Linux下makefile实例讲解 #### 一、Makefile文件介绍与编写方法 **1.1 规则的格式** Makefile的核心在于规则的定义。一个典型的规则包括目标(target)、依赖(dependencies)以及命令(commands)。其基本格式如下...
《深入理解经典makefile实例》 在软件开发中,构建过程是至关重要的,它将源代码编译成可执行程序。在这个过程中,`makefile`起着核心作用,它是自动化构建工具`make`的配置文件,负责定义编译规则、依赖关系以及...
这是个保护模式编程的实例,实例是删除了linux0.01大部分文件,只留下boot/boot.s,boot/head.s,init/mian.c和makefile等几个源程序文件和tools目录下的几个文件。之后修改了makefile使之能编译通过。
在Linux操作系统中,GCC(GNU Compiler Collection)是一个强大的开源编译器套件,它支持多种编程语言,包括C、C++、Objective-C等。对于C语言爱好者来说,掌握如何在Linux下使用GCC编译和运行C语言源文件是至关重要...
本文旨在详细介绍如何利用GCC进行AVR单片机的编程,通过具体的实例讲解编译、链接以及使用Makefile管理项目的全过程。 #### 二、GCC编译流程 在深入了解AVR单片机与GCC编程之前,我们先来看一个简单的例子。这个...
gcc g++ 编译源文件的简单实例,一学就会。
让我们来看一个简单的多目录Makefile示例: ```makefile CC = gcc CFLAGS = -Wall -Iinclude SRCDIR = src OBJDIR = obj BINDIR = bin SOURCES = $(wildcard $(SRCDIR)/*.c) OBJECTS = $(patsubst $(SRCDIR)/%.c, ...
uCOS-II提供了一个可抢占式的多任务环境,通过任务调度算法实现任务间的切换。其核心组件包括任务管理、事件标志组、消息邮箱、信号量、互斥信号量、内存管理以及时间管理等。理解这些概念是成功配置和使用uCOS-II的...