- 浏览: 794129 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (417)
- ASP.NET MVC (18)
- WEB基础 (24)
- 数据库 (69)
- iPhone (20)
- JQuery (3)
- Android (21)
- UML (8)
- C# (32)
- 移动技术 (19)
- 条码/RFID (6)
- MAC (8)
- VSS/SVN (6)
- 开卷有益 (4)
- 应用软件 (1)
- 软件工程 (1)
- java/Eclipse/tomcat (61)
- 英语学习 (2)
- 综合 (16)
- SharePoint (7)
- linux (42)
- Solaris/Unix (38)
- weblogic (12)
- c/c++ (42)
- 云 (1)
- sqlite (1)
- FTp (2)
- 项目管理 (2)
- webservice (1)
- apache (4)
- javascript (3)
- Spring/Struts/Mybatis/Hibernate (4)
- 航空业务 (1)
- 测试 (6)
- BPM (1)
最新评论
-
dashengkeji:
1a64f39292ebf4b4bed41d9d6b21ee7 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
zi_wu_xian:
PageOffice操作excel也可以设置表格的行高列宽,并 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
wanggang0321:
亲,我在pptx(office2007以上版本)转pdf的时候 ...
JODConverter]word转pdf心得分享(转) -
xiejanee:
楼主:你好!我想请问下 你在代码中用DOMDocument* ...
Xerces-C++学习之——查询修改XML文档 (转)
rm *.o
1:编译可执行程序。2:编译lib库 3:编译so库
本博针对上面三种目的各自写出了makefile模版,希望对大家有所帮助。
一.编译可执行程序
当前目录下制定文件编译成可执行文件(连接外部库的话只需要更改INC和LIB即可)
CXX =
g++
TARGET =
bitmaploctest
C_FLAGS +=
-
g -
Wall
LIB_FLAGS =
-
pthread
all:
$(TARGET)
bitmaploctest:
bitmaploctest.o bitmaploc.o file_lock.o
$(CXX) -
o $@ $^
$(LIB_FLAGS) $(LIB) $(C_FLAGS)
.cpp.o:
$(CXX) -
c -
o $*
.o $(INC) $(C_FLAGS) $*
.cpp
.cc.o:
$(CXX) -
c -
o $*
.o $(INC) $(C_FLAGS) $*
.cc
clean:
-
rm -
f *
.o $(TARGET)
二.编译成lib库
当前目录下指定文件编译成lib库(一般lib库在编译的时候不会将使用的外部库编译进来,而是等编译成可执行程序时或者.so时)
INC_DIR=
./
SRC_DIR=
./
OBJ_DIR=
./
LIB_DIR=
./
H_DIR=
./
OBJ_EXT=
.o
CXXSRC_EXT=
.cpp
CSRC_EXT=
.c
LIB_EXT=
.a
H_EXT=
.h
OBJECTS =
$(OBJ_DIR)bitmaploc$(OBJ_EXT) \
$(OBJ_DIR)file_lock$(OBJ_EXT)
LIB_TARGET =
$(LIB_DIR)libbitmaploc$(LIB_EXT)
$(OBJ_DIR)%
$(OBJ_EXT):
$(SRC_DIR)%
$(CXXSRC_EXT)
@echo
@echo “Compiling $<
==
>
$@…”
$(CXX) $(INC) $(C_FLAGS) -
c $<
-
o $@
$(OBJ_DIR)%
$(OBJ_EXT):
$(SRC_DIR)%
$(CSRC_EXT)
@echo
@echo “Compiling $<
==
>
$@…”
$(CC) -
I./
$(INC) $(C_FLAGS) -
c $<
-
o $@
all:
$(LIB_TARGET)
$(LIB_TARGET):
$(OBJECTS)
all:
$(OBJECTS)
@echo
$(AR) rc $(LIB_TARGET) $(OBJECTS)
@echo “ok”
clean:
rm -
f $(LIB_TARGET) $(OBJECTS)
三.编译成so库
当前目录下指定文件编译成so库(必须将所有引用的外部库都编译进来)
CC =
gcc
CXX =
g++
CFLAGS =
-
Wall -
pipe -
DDEBUG -
D_NEW_LIC -
g -
D_GNU_SOURCE -
shared -
D_REENTRANT
LIB =
-
lconfig -
ldl -
lrt -
L../
../
lib -
lttc -
g
INCLUDE =
-
I../
spp_inc
OO =
service.o tinystr.o tinyxml.o tinyxmlerror.o tinyxmlparser.o uin_conf.o stat.o
TARGETS =
../
../
lib/
libRanch.so
all:
$(TARGETS)
stat:
tool_stat.cpp
$(CXX) $(INCLUDE) tool_stat.cpp -
o tool_stat stat.o tinystr.o tinyxml.o tinyxmlerror.o tinyxmlparser.o -
g
cp tool_stat ../
../
bin
$(TARGETS):
$(OO)
$(CXX) $(CFLAGS) $(INCLUDE) $(OO) -
o $@ $(LIBDIR) $(LIB)
.c.o:
$(CC) $(CFLAGS) -
c $(INCLUDE) $<
echo $@
.cpp.o:
$(CXX) $(CFLAGS) -
c $(INCLUDE) $<
echo $@
%
:
%
.c
$(CC) $(CFLAGS) -
o $@ $<
$(OO) $(LDFLAGS)
echo $@
clean:
rm -
f *
.o
rm -
f $(TARGETS)
rm -
f tool_stat
CC=cc -g
LLIBSQL= `cat $(LIBHOME)/sysliblist` \ -lclntsh
|
2.说明
2.1一般makefile编写有3个步骤
1.宏定义。主要功能是定义一些宏变量已替代较长的编译支持信息。一般情况下针对编译所需要得.h头文 件,.a/.so的库文件路径。比如例子中的CFLAGS是oracle预编译需要数据库支持的头文件路径。LIBHOME是oracle环境编译需要数 据库库文件路径。
2.源文件之间的相互依赖关系。列出需要产生目标文件编译依赖的文件。比如例子中的test目标,其产生时会检测(test.o test1.o test1.o)这些依赖文件的变化,如果依赖文件有变化会自动先编译依赖文件。
3.可执行的命令.即针对目标关系,所作出的编译行为。比如test其检测完依赖文件后执行(cc -o $@ $(CFLAGS) $(LIBS) $^)编译链接产生目标执行文件test.
4.宏使用时用(),{}来确认宏名称例如${LIB}加{}会查找LIB的宏内容,$LIB会查找L的宏内容。
2.2 :常用编译项说明
1. -I:制定头文件搜索的路径
2. -L:连接需要的库文件路径
3.–l:连接需要的库文件(比如:libmylib.so写作 –lmylib)
2.3: 自动化变量说明:
$+ :所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
$?:所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚
$^ :所有的依赖文件,以空格分开,不包含重复的依赖文件。
$< :第一个依赖文件的名称。
$@ :目标的完整名称。
$* :不包含扩展名的目标文件名称。
$% :如果目标是归档成员,则该变量表示目标的归档成员名称。
具体对照使用以上makefile,执行make haha得到如下对照信息:
$ makehaha
test.otest1.o test1.o
test.otest1.o
test.otest1.o
test.o
haha
2.4:后缀规则:
.SUFFIXES:.sqc .c .o制定新的后缀规则。(%.c:%.sqc),(%.o:%.c)即规则行为。就是将所有.sqc转为.c,.c再转为.o。
.c.o:等价于%.o:%.c
3.注意:
分行符\后面不能再有其他任何内容。
对齐行最好采用^I(tab键)
注释符号#
include包含编译文件
1. 概述
Makefile,what??很多windows程序可能都没听说过
简单的说,Makefile是Unix/Linux环境下描述了整个工程的编译、连接等规则
的文件
,其主要包括三点:
1) 工程中的哪些源文件需要编译以及如何编译
2) 依赖库以及库所在的位置
3) 想得到什么:可执行文件?静态库?动态库?
项目中,我们会有很多源文件、头文件、依赖库文件、配置文件等等,通过Makefile定义规则来制定编译顺序,编译规则,编译依赖,甚至更复杂的功能,将极大的方便我们的开发,其最大的好处就是”自动化编译“,通过‘make’就可以方便的进行整个项目的编译工作。
2. 编译链接
从源码到可执行文件,具体步骤:
源码--->预处理--->编译--->汇编--->链接
我们常常把预处理、编译和汇编三个阶段统称为编译阶段,在这个阶段,编译器会检查程序语法、函数与变量是否声明等。
经过编译之后,unix/linux下,将得到.o文件(一般来说,每个源文件都能生成一个对应的.o文件),即object
file(windows下即.obj文件),.o不能直接运行,我们需要将其合成可执行文件,这个过程就叫链接。在链接过程,链接器会在所有的.o文件
中找寻函数的实现,如果找不到,则会报链接错误。
3.Makefile规则
Makefile只有一个规则:
target: prerequisites
command
target:即目标,它可以是可执行文件、可以是.o文件,也可以是一个标签,简单的说,它就是你要做的事情。
prerequisites:生成target所需要的条件,它可以是一个文件,也可以是另外一个target
command:具体执行的命令
解释如下:target这个目标依赖于prerequisites中的文件,其生成规则定义在command中。
更简单一点表达:如果prerequisites中任何一个文件的时间要比target文件更新的话,command所定义的命令就会执行。
eg:
=====makefile=====
#第一个规则
test: main.o hello.o
gcc main.o hello.o –o test
#第二个规则
main.o: main.c
gcc –c main.c
#第三个规则
hello.o: hello.c hello.h
gcc –c hello.c
#第四个规则
clean :
rm –rf *.o
rm –rf test
=====makefile=====
第一个规则:
test就是target, main.o和hello.o是prerequisites,'gcc main.o hello.o –o test’是command。
即:要生成test,就需要有main.o和hello.o,如果main.o或者hello.o文件的时间比test新(或者test文件不存在),则会执行命令’gcc main.o hello.o –o test’,
第二个规则:
target是main.o,main.c是prerequisites,’gcc –c main.c’是command
即:要生成test,就需要main.c,如果main.c文件的时间比main.o新,则会执行’gcc –c main.c’
第三个规则和第二个规则类似
第四个规则:
这里,target是clean,此处,clean并不是一个文件,而是一个动作的名字,它的执行,需要显示的在make命令后制定,例如,此处执行
‘make clean’,将调用其后的command,即‘rm –rf *.o rm –rf
test’,另外,此处没有prerequisites,即任何时候都执行command
我们来看下如果执行'make'会做什么:
1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“test”这个文件,并把这个文件作为最终的目标文件。
3、如果test文件不存在,或是test所依赖的后面的[.o]文件的文件修改时间要比test这个文件新,那么,他就会执行后面所定义的命令来生成test这个文件。
4、如果test所依赖的.o文件存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。
5、依次类推,直到生成的所有的target都是最新的。
用户如果执行'make clean',由于其后面没有依赖,则执行command所定义的命令。
如果我们修改了代码main.c,然后执行‘make’,由于main.c时间比main.o新,那么main.o会重新编译生成,由于main.o文件的时间比test新,那么test也会重新生成。
发表评论
-
c++ cin输入int的用法
2014-06-10 11:17 1353int icin = 0; for(int i =0; ... -
Linux下case报错syntax error near unexpected token `in
2014-05-20 16:16 1105来分享一个在Linux下执 ... -
查看linux某目录下所有普通文件,不含目录
2014-05-14 15:15 0#include <fstream>#i ... -
scp sz
2014-03-31 18:15 0使用的是secureCRT 那么先拷贝到这台服务器上,再下 ... -
Linux可执行文件执行时找不到共享库
2014-03-31 18:09 2261编译程序时使用了如下参数指定了链接库的位置,但是执 ... -
C++ assert机制
2014-03-06 10:21 925C++ assert机制 ASSERT ... -
为什么C++语言中既有指针也有引用
2013-11-19 11:16 0写在前面的话,本文是 ... -
C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
2013-11-19 10:20 806栈,就是那些由编译器 ... -
堆内存和栈内存
2013-11-19 10:13 0堆内存就是你用new 修饰符创建的内容会在堆内存中开辟一段空 ... -
C++使用CLI连接DB2
2013-11-15 09:31 3374<!--推荐博文--> ... -
使用 C++ 处理 JSON 数据交换格式
2013-09-10 11:10 909一、摘要 JSON 的全称为:JavaScript Obj ... -
C++的Json解析库:jsoncpp和boost (转)
2013-09-10 10:40 6624JSON(JavaScript Object Notatio ... -
C++ JsonCpp 使用(转)
2013-09-10 10:21 1778前言 JSON是一个轻量级 ... -
C++中map容器的说明和使用技巧(转)
2013-08-22 15:01 1031C++中map容器提供一个键值对容器,map与multim ... -
C++中各种类型的成员变量的初始化方法(转)
2013-08-01 15:26 1018c++各种不同类型成员根据是否static 、时候con ... -
Xerces浅析
2013-07-30 14:15 3139本篇文章主要讲述项目 ... -
Xerces C++ 学习笔记 (转)
2013-07-24 17:04 13191. 初始化平台: XMLPlatformUtils: ... -
Boost智能指针——shared_ptr (转)
2013-07-16 17:27 1783boost::scoped_ptr虽然简单易用,但它不能共享 ... -
GDB调试精粹及使用实例 (转)
2013-07-16 16:21 1071一:列文件清单1. List( ... -
Xerces-C++学习之——查询修改XML文档 (转)
2013-07-16 16:02 3343/** ========================== ...
相关推荐
`Makefile` 的编写是项目构建自动化的核心,它定义了一系列规则,告诉操作系统如何构建、编译、测试软件。下面将深入探讨 `Makefile` 的编写及其相关知识点。 首先,我们要理解 `Makefile` 的基本结构。`Makefile` ...
#### 四、编写规则 ##### 4.1 规则的语法 - 规则的基本格式包括目标、依赖项和命令。 - 支持通配符和条件语句。 ##### 4.2 在文件名中使用通配符 - 通配符如 `*` 和 `?` 可用于匹配文件模式。 - 示例: ``` %.o ...
`Makefile`是一个文本文件,包含了编译项目的规则和依赖关系。`make`命令会根据`Makefile`中的规则来决定哪些目标需要重新编译。这样可以节省大量时间,因为`make`只会更新自上次构建以来发生变化的文件。 ### 2. `...
总之,“非常完善的makefile编写指导说明”文档将详细介绍这些概念,并通过实例解释如何编写和优化`makefile`,确保开发者能够灵活地管理他们的C++项目。阅读并实践这份文档,你将能够轻松应对各种复杂编译场景,把`...
makefile允许开发者定义一系列规则,这些规则描述了如何编译和链接源代码文件,以及如何根据源代码的更新自动重新编译项目。对于拥有大量文件、结构复杂的项目而言,makefile的重要性不言而喻。 #### Makefile的...
#### makefile的编写规则--语法及函数 - **条件表达式**: `ifeq`、`ifdef`等用于条件判断。 - **函数**: 提供字符串处理、文件名操作等功能。 #### 控制make的函数 - **`$(error)`**: 打印错误信息并终止make。 -...
在Linux系统中,`makefile`是一个非常重要的工具,它帮助开发者自动化编译、链接以及构建项目的流程。本文将深入探讨`makefile`...通过理解和编写`makefile`,开发者能够更好地控制编译流程,节省时间,提高开发效率。
在编写Makefile文件时,手册详细说明了Makefile文件应该包含哪些内容、文件命名规范、如何包含其他Makefile文件、变量MAKEFILES的使用、Makefile文件的重新生成过程以及如何重载其他Makefile文件。此外,还解释了...
总之,`Makefile`是构建工程化项目的重要组成部分,通过学习和实践这个实例,你不仅可以理解`Makefile`的基础知识,还能掌握如何编写和管理自己的构建脚本,提升开发效率。记住,`Makefile`的灵活性和强大功能在于其...
3. 对于大型项目,考虑使用GNU Make的自动变量,如`$@`代表目标文件,`$代表第一个依赖文件,简化规则编写。 通过本教程,你将能够理解和创建自己的Makefile,有效地管理和构建项目。"Makefile经典教程 快速掌握....
在编程世界中,Makefile是自动化构建工具,用于编译、链接、测试等步骤,尤其在C/C++项目中广泛使用。GCC(GNU Compiler Collection)是常用的C/C++编译器...记住,编写清晰、易于维护的Makefile是项目成功的关键之一。
在Linux操作系统中,Makefile是构建程序的重要工具,它自动化了编译、链接等过程,大大提高了开发效率。...阅读提供的"如何编写Makefile.pdf"文档,将深入了解更多细节和实例,帮助你成为Makefile的高手。
#### 一、Shell文件内调用Makefile文件 在实际应用中,我们经常需要从一个Shell脚本中调用Makefile来完成特定的任务,比如编译项目或者安装软件包。下面是一个简单的示例: ```bash #!/bin/bash cd template-2.1 ....
- **递归调用**:处理子目录中的makefile文件,实现更复杂的项目结构管理。 #### 六、总结 通过本文的学习,你应该已经掌握了makefile的基础知识以及如何编写一个简单的makefile。makefile不仅是Linux下软件项目...
本教程主要聚焦于Linux编程中的`makefile`编写,通过实例来讲解如何创建并使用`makefile`。 首先,`makefile`是用于控制编译规则和构建步骤的文本文件,它告诉`make`命令如何编译程序。在`jiqiao.rar`这个压缩包中...
#### 二、编写规则 **2.1 规则的语法** 规则的基本语法已在前文提到,这里不再赘述。需要注意的是,规则中的目标和依赖都是文件名,而命令则是一系列具体的编译或链接指令。 **2.2 在文件名中使用通配符** ...
学习多目录Makefile的编写,不仅可以提高代码组织的效率,还能帮助你更好地理解和控制项目的构建过程。实践中,你可能需要根据具体需求调整这些示例,例如处理不同语言的源文件,或者添加自定义的编译选项。熟悉...
Makefile 是一种用于自动化构建软件项目的脚本文件,它基于特定的规则和语法,与 `make` 工具配合使用,帮助开发者简化编译过程,提高开发效率。在软件开发过程中,项目通常包含大量的源代码文件,如果每次都需要...
### 如何理解与编写Makefile文件 #### 一、Makefile简介 Makefile是一种用于自动化构建过程的脚本文件,广泛应用于软件项目的编译管理。它通过定义一系列规则来指示如何编译源代码以及如何将它们链接成最终的可...
Makefile是Unix/Linux环境下的一种自动化构建工具,它定义了一系列的规则来决定哪些文件需要被编译、链接,以及如何执行这些操作。对于驱动程序开发,由于涉及到内核模块的编译,Makefile的重要性不言而喻。 首先,...