`
andrew913
  • 浏览: 187423 次
  • 性别: 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  
我认为还不错

相关推荐

    wireshark源码

    - Makefile.am - UNIX/Linux的makefile模板 - Makefile.common - 包含了插件文件的名称 - Makefile.nmake - 包含了针对Windows平台的Wireshark插件makefile - moduleinfo.h - 包含了插件版本信息 - moduleinfo.nmake...

    Android.mk文件语法规范及使用模板.pdf

    具体来说:-该文件是GNU Makefile的一小部分,会被编译系统解析一次或更多次的build系统。因此,您应尽量减少您声明的变量,不要认为某些变量在解析过程中不会被定义。-这个文件的语法允许把你的源代码组织成模块,...

    speedbag:一个软件包,用于为TSV解析为数组提供加速的基于C的例程

    虫子内容Makefile.in Makefile模板中。 配置脚本使用该文件生成最终的Makefile。 自述文件aclocal.m4生成的文件。 不要编辑。 在生成最终的配置脚本时,Autoconf将其用作输入。 请参阅下面的“ tcl.m4”。 配置生成...

    Android.mk文件语法规范及使用模板

    具体来说:-该文件是GNU Makefile的一小部分,会被编译系统解析一次或更多次的build系统。因此,您应尽量减少您声明的变量,不要认为某些变量在解析过程中不会被定义。-这个文件的语法允许把你的源代码组织成模块,...

    dev-ops-admin:用于创建和管理Python项目模板以进行代码分析,测试和部署的命令行界面

    生成一个Cookiecutter模板(请参阅 ), 将模板代码打包在Python发行版中,例如,二进制车轮打包, 使用布尔命令行标志或以交互方式配置模板, 使用git config自动解析作者信息。 可选模板组件: (带有和后端...

    servant-template:Servant项目的Cookiecutter模板

    一个(几乎)生产就绪的Servant服务器的模板。 我的目标是通过以非侵入性或规范性的方式汇总一些最佳实践,来减少开始在Haskell REST API服务器上工作的人们的摩擦。 用法 $ pip install --user cookiecutter $ ...

    regex-regex:正则表达式解析正则表达式字符串

    解析字符串。 安装 $ npm install regex-regex 用法 var re = require ( 'regex-regex' ) ; 关于 解析字符串。 var bool = re . test ( '/^beep$/' ) ; // returns true bool = re . test ( '' ) ; // returns ...

    rocketcp::bullseye:竞争性编程应富有成效

    一个命令行客户端,用于使用竞争性同伴扩展来解析和制作测试用例的文件夹和文件,并测试解决方案。 用一个 :bullseye: 旨在提高竞争性程序设计的生产力 用法[截至开发阶段]: 这是我们的不和谐服务器链接-https: ...

    livescript-cli-seed:LiveScript CLI 应用程序的模板项目

    CLI 应用程序的简单模板 带有常见任务的 makefile 启用映射( ) 解析process.argv由您决定,推荐使用或 ├── package.json ├── README.md ├── Makefile ├── bin │ ├── cli │ └── cli-...

    Tinyxml 源代码(VC6 & VS2005)

    简单地说,TinyXML解析一个XML文档并由此生成一个可读可修改可保存的文档对象模型(DOM)。 XML的意思是“可扩展标记语言“(eXtensible Markup Language)。它允许你创建你自己的文档标记。在为浏览器标记文档...

    doxypressapp:DoxyPress的GUI应用程序

    重大改进解析中用户选择使用clang代替常规lex解析器对C和C ++进行完全解析Clang解析器允许复杂的现代C ++准确解析,尤其是在更新C ++时为makefile文件添加了一个新的解析器类和容器DoxyPress与CopperSpice库的链接...

    doxypress:从带注释的源(多种源语言)生成文档

    为makefile文件添加了一个新的解析器 记录以下计算机语言:C,C ++,Objective-C,C#,Fortran,Java,IDL,Python,PHP和TCL 类和容器 DoxyPress与CopperSpice库的链接 删除了所有Qt 2类和容器 重构为使用基于值...

    nodejs-packaging:OpenSUSE NodeJS打包模板

    OpenSUSE中NodeJS软件包的模板。 对于任何特定版本的NodeJS,例如12或6(以下称为X),在Makefile中发生以下工作流程,请运行make nodeX NodeJS程序包nodeX正在从主项目中签出 common /目录中的文件直接复制到...

    eclipse 开发c/c++

    C 和 C++ 语言都是世界上最流行且使用最普遍的编程语言, 因此 Eclipse 平台(Eclipse Platform)提供对 C/C++ 开发的支持一点都...GDB/MI 提供了一种新的面向机器的接口, 它非常适合于想要直接解析 GDB 输出的程序。

    braindump:我个人的脑力激荡

    我的Zettelkasten创意之家 ... 使用我自己的起始模板,代码读取标签和链接,以便在每个页面的末尾也创建自动查看。 有关如何使用库的信息,请参见org-roam-clj。 小索引可快速访问 程式设计 , 。 另请参阅(生成)

    Tcl_TK编程权威指南pdf

    同学们在努力编制一个新式的内核程序,而John编写了一个新的编辑器和终端仿真程序。他使用Tcl作为这两种工具的命令语言,这样用户就可以定义菜单或者对那些程序进行定制。那时还处在使用X10的时代,他计划编写一个...

Global site tag (gtag.js) - Google Analytics