目录

  • 1. Makfile
    • 1.1.基础
    • 1.2. 伪对象.PHONY
    • 1.3. 变量
      • 1.3.1. 普通变量
      • 1.3.2. 自动变量
    • 1.4.依赖第三方库
  • 2. CMake

Makefile 是编译一段c语言代码的一种shell脚本。我们在执行make的之前,是需要确保makefile存在于目录当中的。其中,编译的时候,我们要规定一些名称。先来看一段基本的makefile代码

1. Makfile

1.1.基础

simple: main.o foo.ogcc -o simple main.o foo.o
main.o: main.cgcc -o main.o -c main.c
foo.o: foo.c gcc -o foo.o -c foo.c
clean: rm simple main.o foo.o

首先,我们要将这些代码能够编译成目标文件simple,第一行里的simple是目标main.iofoo.o是依赖。第二行编译就是命令行。第三行是子目标,用来生成simple里所需要的依赖。倒数第二行clean就是删除已经编译好的文件。关于编译的顺序,我们是先编译main.c到main.o, 在foo到foo.o, 按照依赖的从左向右的顺序编译

1.2. 伪对象.PHONY

.PHONY: main clean
simple: main.o foo.ogcc -o simple main.o foo.o
main.o: main.cgcc -o main.o -c main.c
foo.o: foo.c gcc -o foo.o -c foo.c
clean: rm simple main.o foo.o

如果你的文件夹里有个叫做clean的文件,且你使用了第一部分的代码,就会让你无法make file。会提示make: 'clean' is up to date。为了防止这种现象发生,我们引入伪对象.PHONY, 这样可以防止因为文件夹有与某个操作(比如clean)同名的文件,而让你无法正常编译代码。

1.3. 变量

1.3.1. 普通变量

.PHONY: main clean
CC  = gcc
RM = rm
EXE = simple
OBJS = main.o foo.o$(EXE): $(OBJS)$(CC) -o $(EXE) $(OBJS)
main.o: main.c$(CC)  -o main.o -c main.c
foo.o: foo.c $(CC)  -o foo.o -c foo.c
clean: $(RM) $(EXE) $(OBJS)

为了简化我们的代码,使得更加统统,我们可以对某些指令定义一些变量名。这个稍微类似于linux里的变量但不太一样。linux调用变量是${},而makefile里面是$().并且make file定义变量的时候允许空格,linux不允许。

1.3.2. 自动变量

  • $@是任何命令被运行的目标。
  • $^ 是规则中所有先决条件。
  • $<是规则中的第一个先决条件。
    然后根据这些规则,可以改写上述自动编译函数
.PHNOY: clean
RM = rm
EXE = simple
SRCS = $(wildcard *.c)
OBJS = $(patsubst %.c, %.o, $(SRCS))$(EXE): $(OBJS)$(CC) -o $@ $^
%.o:%.c$(CC) -o $@ -c $^
clean:$(RM) $(EXE) $(OBJS)

这里有两个语法,一个是wildcard, 还有一个是patsubst。前者是通配符函数,可以表示匹配的函数,后者是字符串替换,形式就是 $(patsubst pattern, replacement, text)等等。我上课的时候还问到老师为什么要用百分号 %.c%.o, 而不是星号。老师回答这是规定。我后来通过查阅资料知道,%就像wildcard一样,匹配任数字或者字符,在一个单词内。如果字符串里包含百分号,第一个百分号就是通配符,第二个百分号不会变,还是百分号。

1.4.依赖第三方库

其实我们的代码可能会依赖很多第三方库。我们的代码不只有这些文件。我们可能会加入当前工程的头文件路径,库文件路径等等,并且还想把库文件打印,所以我们可以加上以下这些行

HEADER_PATH = -I ./include/
LIB_PATH = -L ./lib/
#define the lib name libpthread.so
LIBS=-lpthread
...
$(EXE): $(OBJS)$(CC) -o $^ -o $@ $(LIB_PATH) $(LIBS)

2. CMake

CMake 类似于Linux的automake,区别在于它只产生标准的构建档,而不是最终的软件。所以每次CMake之后,我还要自己取build。
Cmake的文件CMakeLists.txt需要有最小cmake版本号。

#lowest verion number
cmake_minimum_required (VERSION 2.8)
SET(SRC_LIST main.c)
MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR})
ADD_EXECUTABLE(DIR ${SRC_LIST})

设置SET()中SRC_LIST为main.c,并且让软件能够发送信息。然后再给目标目录DIR添加可执行文件。

如果需要cmake安装到置顶目录,需要在运行cmake的时候添加-DCMAKE_INSTALL_PREFIX=/tmp/usr/...

文章参考于<零声教育>的C/C++linux服务期高级架构系统教程学习

【C基础】Makefile(含.phony的作用)和CMake相关推荐

  1. makefile中.PHONY的作用是什么?

    makefile中.PHONY的作用是什么?   初学makefile的时候,有一个关键字".PHONY"搞不懂,在请教过同学之后豁然开朗,遂写下经验望帮助更多的同学能够理解. 在 ...

  2. Makefile中.PHONY的作用

    单词phony (即phoney)的意思是:伪造的,假的.来自collins的解释是: If you describe something as phoney, you disapprove of i ...

  3. Makefile之 .PHONY 作用

    Makefile之 .PHONY 作用 ./PHONY 来显示的指名一个目标是伪目标,有两个作用一个是改善性能,另外一个是来避免冲突. 例如我写了这样一个Makefile [cpp] view pla ...

  4. Makefile文件中的 .PHONY 的作用

    我们可以看到即使不要.PHONY这一行,make proto 命令也是正常执行,那 .PHONY 的作用究竟是什么呢? 我先在Makefile的同级目录下建一个文件名为 proto 文件. .PHON ...

  5. 三校生计算机题目及答案,“三校生”对口升学计算机应用试卷计算机基础知识(含答案)...

    适合"三校生"对口升学用试卷 "三校生"计算机应用基础试卷(含答案) 课程名称:计算机应用基础 一.是非选择题(对的选A,错的选B.本大题共15小题,每小题1分 ...

  6. 网络教育计算机基础应用,网络教育-计算机应用基础-1(含答案)

    <网络教育-计算机应用基础-1(含答案)>由会员分享,可在线阅读,更多相关<网络教育-计算机应用基础-1(含答案)(20页珍藏版)>请在人人文库网上搜索. 1.计算机基础知识基 ...

  7. 大学计算机基础算什么水平,大学计算机基础(含实验)

    大学计算机基础(含实验) 语音 编辑 锁定 讨论 上传视频 <大学计算机基础(含实验)>是2006年9月清华大学出版社出版的图书,作者是王长友.王中生.[1] 书    名 大学计算机基础 ...

  8. 32位计算机通常是指控制总线,“三校生”对口升学计算机应用试卷计算机基础知识(含答案)...

    "三校生"计算机应用基础试卷(含答案) 课程名称:计算机应用基础 题 五 六 总分 统分 号 一 二 三 四教师 得 分 :名一.是非选择题(对的选A,错的选B.本大题共15小题, ...

  9. 微型计算机主存可以分为,计算机基础试题 (含答案)

    计算机基础试题 (含答案) 一.填空题(每空1分,共30分) 1.计算计的软件系统通常分成______软件和______软件. 2.字长是计算机______次能处理的______进制位数. 3.1KB ...

最新文章

  1. 解析错误:相邻的JSX元素必须包装在一个封闭标签中
  2. bat 复制文件夹_Windows批量创建文件夹:用Excel和记事本这2个就够了
  3. CV之路 —— Opencv学习
  4. 1017 Queueing at Bank (25 分) 【未完成】【难度: 中 / 知识点: 模拟】
  5. 理解伪元素 :before 和 :after
  6. 几十万人同时在线的直播间聊天,如何设计服务端架构?
  7. JAVA两类比较器的区别(Comparable,Comparator)
  8. [Git高级教程 (一)] 通过 Tag 标签回退版本修复 bug
  9. SQL Server 2008R2数据库文件导入到SQL Server 2008数据库中
  10. oracle通信通道的文件结尾_【移民】加拿大安省发放优才计划移民邀请函;NS省干掉特快通道直申种类的申请通道...
  11. html5权威指南 预读,《HTML5权威指南》
  12. java9 多版本兼容jar_Java 9 多版本兼容 jar 包
  13. Android之进程间通信AIDL
  14. RCP程序中集成其他插件的配置方法
  15. centos修改用户密码图形化
  16. 74LS138译码器真值表以及快速计算方法
  17. 银行计算机综合知识,银行秋招综合知识测试包含哪些专业课?
  18. 如何简单快速的写出幸运转盘抽奖
  19. 支付宝InfoStr怎么获取
  20. gcc O3和O0编译的输出浮点数不相同

热门文章

  1. Ambiguous handler methods mapped 模棱两可的方法
  2. 区块链术语中英对照表
  3. 动作识别01:Understanding action recognition in still images
  4. Linux,用户与用户组的创建与分配
  5. 两个聊天机器人的情话--今天打开淘宝旺旺看到聊天机器人,于是聊了两句,很有趣.........
  6. JavaScript设计模式——组合模式
  7. Android省电开发 浅析
  8. Idea变量字段标记粉色下划线是怎么回事
  9. 光线传媒(300251)与泰冏
  10. 第一款真正意义上的区块链游戏是?