Makefile基础---编译
首先写一个自己的库:
- #include "../MyAPI.h"
- #include <cstdlib>
- #include <ctime>
- int getRandom(int boundary)
- {
- if (boundary <= 0 )
- {
- return 0;
- }
- srand((unsigned)time(NULL));
- return rand() % boundary;
- }
这里的MyAPI.h是库对应的头文件(这里用../MyAPI.h是因为库文件源代码在lib目录下,而头文件跟lib目录在同级目录):
- int getRandom(int boundary);
2. 接着要编译这个库,在这之前需要将源文件编译成.o文件:
3. 之后再将.o文件打包成lib,在类Unix系统中,静态库是.a文件:
4. 之后就是使用这个lib库了,下面是使用该库的源代码:
- #include "basic.h"
- int main()
- {
- cout << getRandom(20) << endl;
- }
5. 源代码中只需要包含头文件就可以了,重点在于编译的时候,下面是编译命令:
这里需要注意两点:
1) -L参数指定包含lib的目录;-l指定lib名;
2)lib名也需要注意,名称是libMyAPI.a,但是使用时不需要加lib和.a后缀。
当然也可以不使用-L -l等选项,直接使用lib全称:
之后生成的a.out就可以使用了。
这里之所以提到-L和-l参数,原因是在写makefile时,-L和-l会带来更多的便利。
以上是一个简单的例子。
也可以写一个makefile文件来做这个,下面是一个makefile的例子:
- #####################################################################
- ## file : test makefile for build current dir .cpp ##
- ## author : ##
- ## date-time : ##
- #####################################################################
- CC = gcc
- CPP = g++
- RM = rm -rf
- ## debug flag
- DBG_ENABLE = 1
- ## source file path
- SRC_PATH := .
- ## target exec file name
- TARGET := test
- ## get all source files
- SRCS += $(wildcard $(SRC_PATH)/*.cpp)
- ## all .o based on all .c
- OBJS := $(SRCS:.cpp=.o)
- ## need libs, add at here
- LIBS := MyApi
- ## used headers file path
- INCLUDE_PATH := .
- ## used include librarys file path
- LIBRARY_PATH := lib
- ## debug for debug info, when use gdb to debug
- ifeq (1, ${DBG_ENABLE})
- CFLAGS += -D_DEBUG -O0 -g -DDEBUG=1
- endif
- ## get all include path
- CFLAGS += $(foreach dir, $(INCLUDE_PATH), -I$(dir))
- ## get all library path
- LDFLAGS += $(foreach lib, $(LIBRARY_PATH), -L$(lib))
- ## get all librarys
- LDFLAGS += $(foreach lib, $(LIBS), -l$(lib))
- ## c++11 support
- CFLAGS += -std=c++11
- all: build
- build:
- $(CPP) -c $(CFLAGS) $(SRCS)
- $(CPP) $(CFLAGS) -o $(TARGET) $(OBJS) $(LDFLAGS)
- $(RM) $(OBJS)
- clean:
- $(RM) $(OBJS) $(TARGET)
- targets:prerequisites
- commands
如上例所示:
这是因为main.c没有修改过,它比a.out要旧。
变量
- targets:xx=yy
下面是一个例子:
函数
- $(<fucn><params>)
函数名与参数间用空格隔开,参数之间用逗号隔开。
make后得到的结果是goodbye world。
控制语句
- ifeq/ifneq
- else
- endif
举例:
- ifdef/ifndef
- else
- endif
举例:
函数的基础请参考Makefile基础。
字符串处理函数
- $(subst <from>,<to>,<text>)
作用:将text中的from替换成to,并返回修改后的text(当然也有可能没有被修改)。
- $(patsubst <pattern>,<replacement>,<text>)
作用:基本同subst,只是这里变成了对满足模式的字符串的替换。
- $(strip <string>)
作用:将string前后的空格去掉并返回修改后的string(当然也有可能没有被修改)。
- $(findstring <find>,<in>)
作用:在in中找字符串find,如果找到了就返回find,否则返回空。
- $(filter <pattern...>,<text>)
作用:过滤text字符串,只保留符合模式的字符串,pattern可以有多个。
- $(filter-out <pattern...>,<text>)
作用:同filter刚好相反,这里删除符合模式的字符串。
- $(sort <list>)
作用:升序排序list里面的单词。
- $(word <n>,<text>)
作用:取text中的第n个单词,从1开始算。
- $(wordlist <s>,<e>,<text>)
作用:取text中第s个开始到第e个为止的单词,包括第e个单词。
- $(words <text>)
作用:返回text中的单词数。
- $(firstword <text>)
作用:返回text中的第一个单词。
文件名操作
- $(dir <names...>)
作用:取names中的目录部分。
- $(nodir <names...>)
作用:取names中的非目录部分。
- $(suffix <names...>)
作用:取names中的后缀部分,比如main.c就取得.c部分。
- $(basename <names...>)
作用:取names中的前面部分,比如main.c就取得main部分。
- $(addsuffix <suffix>,<names...>)
作用:给names中的每一个成员加后缀suffix。
- $(addprefix <prefix>,<names...>)
作用:给names中的每一个成员加前缀prefix。
- $(join <list1>,<list2>)
作用:将list1中的单词加到list2对应位置的单词之后。没有对应的就不管了。
- $(abspath <names...>)
作用:返回绝对路径。
结构函数
- $(foreach <var>,<list>,<text>)
作用:取出list中的每一个单词并赋值给var,再执行text语句。
- $(if <condition>,<then-part>,<else-part>)
作用:判断condition条件,满足条件就执行then-part,否则执行else-part。两个part都可以是空。
call函数
- $(call <expression>,<param1>,<param2>...)
作用:执行expression,后面的是参数,它们在expression中用$(1)$(2)...表示。
origin函数
- $(origin <var>)
作用:确定var的来源,是undefined?default?environment?file?command line?override?automatic?
shell函数
- $(shell <cmd>)
作用:执行cmd命令。相当于`cmd`。
eval函数
- $(eval <text>)
作用:不明。
似乎是展开text,作为Makefile的一部分。但是为什么要这么做,为什么不直接写text,不明白。。。
告警/错误函数
- $(error <tetx>)
作用:显示错误并停止执行。
- $(warning <text>)
作用:显示告警,但是会继续执行。
wildcard函数
- $(wildcard pattern...)
作用:返回工作目录下满足pattern的所有文件名,多个文件名之间用空格隔开。
运行make之后的结果:
Makefile基础---编译的更多相关文章
- Makefile基础学习
Makefile基础学习 理论知识 makefile关系到了整个工程的编译规则.一个工程中的源文件不计其数,并且按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文 ...
- Makefile基础(三)
第一章:C语言之Makefile基础(一) 第二章:C语言之Makefile基础(二) 再来看一个简单的例子: [root@localhost linux_c]# cat Makefile foo = ...
- Makefile基础(二)
上一章:C语言之Makefile基础(一) 上一章的Makefile写的中规中矩,比较繁琐,是为了讲清楚基本概念,其实Makefile有很多灵活的写法,可以写的更简洁,同时减少出错的可能 一个目标依赖 ...
- C编译: makefile基础
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在编译一个大型项目的时候,往往有很多目标文件.库文件.头文件以及最终的可执行文件. ...
- Linux学习二:Makefile基础
文首感谢http://www.chinaunix.net 作者:gunguymadman的分享 makefile关系到了整个工程的编译规则.一个工程中的源文件不计数,其按类型.功能.模块分别放在若干个 ...
- 5、Makefile基础知识汇总(转自陈皓总述)
一.Makefile里有什么? Makefile里主要包含了五个东西:显式规则.隐晦规则.变量定义.文件指示和注释. 1.显式规则.显式规则说明了,如何生成一个或多的的目标文件.这是由Makefile ...
- makefile 和 编译条件 的简略总结
#-g gdb可看代码 #-fPIC -fPIC 的使用,会生成 PIC 代码,.so 要求为 PIC,以达到动态链接的目的,否则,无法实现动态链接. -fPIC 作用于编译阶段,告诉编译器产生与位置 ...
- [转] Makefile 基础 (4) —— Makefile 书写命令
该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...
- [转] Makefile 基础 (2) —— Makefile 总述
该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...
随机推荐
- AngularJS进阶(二十二)实现时间选择插件
JS实现时间选择插件 引导语 在项目开发过程中,需要实现根据以日期为筛选条件之一,故需要实现时间选择插件.对于未接触的新事物,自己总是感觉不明觉厉.其实,有些实现可以使用很简单的方法即可.以此为例,偶 ...
- 【Coding算法导论】第4章:最大子数组问题
Coding算法导论 本系列文章主要针对算法导论一书上的算法,将书中的伪代码用C++实现 代码未经过大量数据测试,如有问题,希望能在回复中指出! (一)问题描述 给定一个数组,求数组中连续的子数组的和 ...
- Android万能的指示器
说到 ViewPager 指示器,想必大家都不陌生,绝大部分应用中都有这个.使用频率非常之高.但系统对它的支持并不好,自带的 PagerTabStrip 和 PagerTitleStrip 太弱,很难 ...
- Java的依赖注入(控制反转)
两个主角"依赖注入"和"控制反转": 1.二都说的都是同一件事,只是叫法不同.是一个重要的面向对象编程的法则,也是一种设计模式: 2.英文原称:依赖注入,Dep ...
- Linux网络设置(第二版) --Linux网络设置
Linux网络设置 --网络配置文件与命令 个 附- 服务程序可以不使用固定端口,但是一般对外公开的WebServer不会改变端口,但是像SSH一般推荐更改,可以回避扫描 nmap [IP地址] #扫 ...
- HBase rest
HBase Rest 是建立在HBase java 客户端基础之上的,提供的web 服务.它存在的目的是给开发者一个更多的选择. 1.启动rest 服务 (1)hbase rest start 用默认 ...
- gdb中的define命令
可以使用define命令达到类似于display的效果:比如每ni后显示当前5条指令: define s5 ni x/5i $pc end 甚至可以手动传入要显示指令的条数: define s ni ...
- leetcode之旅(10)-Roman to Integer
题目描述: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range fr ...
- React Native入门 开发第一个React Native应用
1. 首先创建一个目录(比如ReactNativeDir),用于存放各个ReactNative工程的代码 2.使用React Native命令工具来创建(初始化)一个ReactNative项目(tes ...
- 《HelloGitHub》第 25 期
<HelloGitHub>第 25 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程. ...