`
andrew913
  • 浏览: 188681 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

一个不错的makfile 模板解析

阅读更多
先简述下一个c语言项目源码安装的过程
1. ./configure xxxxx
这个过程主要用于生成相应的Makefile,不同的编译选项就会产生不同的makefile.这样以来就可以为不同的CPU(x86? ppc?),机器运行环境,运行参数,安装目录等生成相应的makefile.
2. make
该步骤就是编译
3. make install
该步骤就是为编译的好的可执行文件、配置文件的拷贝。

本文用一个简单的例子简述这个makefile的构成,作为最近学习的总结
本工程文件如下:

main.c //工程主程序
Makefile //makefile文件
Make.properties//makefile的一些编译参数
project.h //用于包含工程中的一些结构体定义,名字一般取项目名称,例如:pppd.h
util.c 
util.h 


这里讲讲全局变量的定义,我个人比较喜欢把全局变量在main.c里面定义,然后再project.h 里面 extern ,所有的其他的.c文件都包含project.h ,如果某个变量只在本文件被使用,可以定义成static 的全局变量,避免其他文件的访问。

所有函数声明都写在.h文件中,例如util.c里面的函数,全部在util.h 里面声明,想调用就直接引用util.h即。

所有的.h 文件最好加上下面这些宏,以免出现重复包含。


#ifndef __PAGENT_H__
#define __PAGENT_H__


OK,来看下我的全能makefile模板吧

下面是Make.properties
CC              = gcc -Wall -g
DEFS            = -pthread -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE
LIBS            = -lpthread 
INCL            = 
CFLAGS          = $(DEFS) $(INCL)


CC,就是编译的命令了哦,这里普通的gcc 哦,在ppc就不是这个了啊。一般都做成在./configure 里面选择。
DEFS 是编译的一些选项
LIBS就是我们应用的库,这里我应用的phtread的.so,这个在/usr/lib这个默认目录下是存在的,如果要应用其他路径的.so,请加上-Lxxxx.

INCL 用于加一些额外的头部文件,例如-Ixxxx 默认当然是/usr/include/了。

下面是Makefile文件

include Make.properties

COMMONOBJS = util.o 
OBJS = main.o
TARGET = project
DEPEND = project.h util.h


.PHONY: install clean

all: $(TARGET)

$(TARGET): $(OBJS) $(COMMONOBJS) $(DEPEND)
	$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(COMMONOBJS) $(LIBS)

%.o:%.c
	$(CC) $(CFLAGS) -o $@ -c $< 
	
install:
	-cp -af project /sbin/ 
	
clean:
	rm -rf $(OBJS) $(TARGET) $(COMMONOBJS)


COMMONOBJS :这个是将要生成的.o文件,一个.c文件生成一个.o ,也就是说你的工程有几个.c文件,都在这里加上。

TARGET :这个就是你讲要生产的可执行文件,例如httpd等

DEPEND :就是你项目中的.h文件

all: $(TARGET)

这一部将会生成你所需要的可执行文件,makfile和ant一样,$(TARGET)其实就是all的前缀。

$(TARGET): $(OBJS) $(COMMONOBJS) $(DEPEND)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(COMMONOBJS) $(LIBS)

%.o:%.c
$(CC) $(CFLAGS) -o $@ -c $<

==========
这一块就是变成的具体命令,首先他会执行

%.o:%.c
$(CC) $(CFLAGS) -o $@ -c $<

这一段就会把.c文件生成.o ,下面$@ $< 从上面传下来的参数。

然后就是执行
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(COMMONOBJS) $(LIBS)

即把所有的.o链接成一个可执行文件

本项目具体的执行过程如下


gcc -Wall -g -pthread -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE  -o main.o -c main.c
gcc -Wall -g -pthread -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE  -o util.o -c util.c
gcc -Wall -g -pthread -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE  -o project main.o util.o -lpthread

可以很清楚的看到,首先生成 .o ,然后把.o 链接成可以执行文件

这个makefile虽然不高级,这个工程很简单,但是麻雀虽然小五脏俱全。加上一个configure文件,就算是比较专业的了。至少我经历过的项目都是这样搞的。

文章内容相对比较浅显,作为最近学习的一个总结。













5
0
分享到:
评论
3 楼 simohayha 2009-08-05  
其实你可以试试scons。最近开始用它,挺不错的。。
2 楼 dopic 2009-08-04  
看看看看看看看看
1 楼 cectsky 2009-07-28  
我认为还不错

相关推荐

    Makefile模板

    一个基本的Makefile模板可能如下: ```makefile CC = gcc CFLAGS = -Wall -g DEPS = dep1.h dep2.h OBJ = src1.o src2.o %.o: %.c $(DEPS) $(CC) -c -o $@ $$(CFLAGS) all: program program: $(OBJ) $(CC) -o ...

    通用Makefile模板

    ### 通用Makefile模板解析与应用 #### 一、Makefile概述 Makefile是一种用于自动化构建过程的脚本文件,在软件开发过程中极为常见。通过定义一系列规则,Makefile能够自动处理项目的编译、链接等任务,极大地提高...

    makefile工程 模板

    首先,让我们理解什么是独立的makefile模板。一个独立的makefile是指不依赖于特定项目结构或特定编译器设置的通用模板,可以适应各种项目需求。这种模板通常包含通用的目标、规则、变量和函数,开发者可以根据自己的...

    app makefile 模板

    Makefile是一个包含了编译、链接等步骤规则的文本文件,它帮助开发者有效地组织和执行编译过程。本文将深入探讨`app makefile`模板及其在软件开发中的应用。 首先,我们需要理解Makefile的基本结构和语法。一个...

    autotools建立makefile实例解析

    最后,`automake`则用于生成Makefile.am,这是一个描述如何构建源代码的模板。`automake`会根据Makefile.am生成Makefile.in,然后`configure`脚本会将Makefile.in转换为最终的Makefile。 在上述流程中,开发者需要...

    一个通用的Makefile

    本文将深入探讨一个通用的Makefile示例,该Makefile适用于大多数C语言项目的编译需求。 #### 二、基本概念与术语 在开始之前,我们需要了解几个关键概念: - **Makefile**:一种用于自动化构建过程的脚本文件,它...

    makefile全套资料&lds链接脚本&通用makefile例子.rar

    通用Makefile例子提供了在各种项目中可复用的Makefile模板,这些模板考虑了多种编译和链接场景,如多源文件项目、库的构建、调试配置等。通过学习和修改这些模板,开发者可以快速为自己的项目创建合适的Makefile,...

    跟我一起写makefile.pdf

    - **嵌套执行 make**:在一个 makefile 中调用另一个 makefile。 - **定义命令包**:将一系列相关命令封装成一个单元,方便管理和维护。 #### 六、变量应用 - **变量的基础**:定义变量的基本语法。 - **变量中的...

    makefile经典教程

    - **Makefile**是一种用于自动化构建过程的文件,通过定义一系列规则来管理项目构建流程。 - **规则**:指明了目标文件与源文件之间的依赖关系以及构建目标所需的命令。 #### 1.1 Makefile的规则 - 规则格式:`...

    Linux下Makefile的automake生成全攻略.pdf

    一个项目通常由多个源代码文件组成,这些文件在开发过程中可能会频繁更改。Makefile通过追踪文件的依赖关系,智能地确定哪些文件需要重新编译,从而避免了不必要的重复工作,提高了构建效率。 在Makefile中,每个...

    sample-makefile.zip

    这个压缩包的目的是为开发者提供一个构建C/C++项目的模板,帮助他们更高效地管理和编译STM32相关的源代码。 【描述】"https://blog.csdn.net/u011011827/article/details/105574118" 是一篇关于如何理解和使用这个...

    大学毕业论文答辩ppt latex模板.zip

    "学术报告latex模板" 这个子文件可能是包含所有模板文件的主文件夹,里面可能包括LaTeX源代码文件(如.tex)、样式文件(如.sty)、图片文件(如.png或.jpg)以及编译配置文件(如.makefile或.texmf.cnf)。...

    makefile 的调试技术

    一个`Makefile`通常包含规则(rules),每个规则定义了一个目标(target)及其依赖(dependencies)以及如何更新目标的操作(recipe)。例如: ```makefile target: dependencies command ``` 在这个模板中,`...

    test for makefile

    "test for makefile"提供了一个实用的模板,展示了如何用Makefile管理多文件夹项目。通过理解并应用这些基本概念,我们可以构建更复杂的Makefile,以适应大型项目的需求。Makefile的灵活性和自动化能力使其成为软件...

    autotools系列工具—-自动生成Makefile

    2. **autoscan**:扫描项目源代码,检测可能存在的移植性问题,并生成一个`configure.scan`文件,作为`configure.in`的基础模板。 3. **autoconf**:基于`configure.in`文件生成最终的`configure`脚本。此脚本用于...

    通用makefile

    本文将深入解析一个通用的 Makefile 模板,它适用于 C/C++ 程序的编译和链接。此模板由 whyglinux 在 2006 年 3 月 4 日创建,旨在为开发者提供一个灵活且易于定制的基础框架,以便快速搭建项目构建环境。 #### ...

    美国大学生数学建模比赛LaTex模板

    《美国大学生数学建模比赛LaTex模板解析》 在信息技术高度发达的今天,数学建模比赛已成为提升学生科研能力和团队协作技巧的重要平台。而在众多的文档处理工具中,LaTex以其专业、美观和高效率的特点,深受广大科技...

    电子-探索者HAL库工程模板.zip

    《电子探索者HAL库工程模板解析》 在嵌入式系统开发中,STM32系列微控制器因其高性能、低功耗、丰富的外设接口以及强大的社区支持,深受工程师喜爱。尤其是STM32 F3、F4、F7及H7等不同型号,覆盖了从入门级到高端...

    纯粹的zbar示例程序(不依赖第三方库)以及OpenWRT的Makefile和测试二维码图片

    ZBar是一个开源的条形码和二维码解码库,它支持多种格式的条码,包括QR码。在提供的压缩包中,`zhc_zbar_demo`是基于ZBar的二维码解码示例程序,其特点在于不依赖任何第三方库,这意味着你可以直接在你的系统上编译...

Global site tag (gtag.js) - Google Analytics