初学者囫囵吞枣急速编写简单Makefile
gcc编译一个文件可以简单分为四步
此时编写一个.c文件,输出hello_world
#include <stdio.h>int main()
{printf("hello_world\n");return 0;}
也就是说我们需要把他编译成可执行文件才能在终端看到输出结果,这时就需要用到gcc编译器了
在文件所在路径执行
$ gcc hello_world.c -o hello_world //包含隐含规则
那么这时我在主函数调用了其他.c文件的函数怎么办
创建一个Common.h文件和一个hello1.c文件
/*****************Common.h*****************/
#ifndef __Common_H
#define __Common_H#include <stdio.h>extern int hello();#endif/*****************hello.c*****************/#include "Common.h"int hello()
{printf("in %s : hello_world!",__func__);return 0;
}/*****************main.c*****************/#include "Common.h"int main()
{printf("in %s : hello_world!\n",__func__);int hello();return 0;
}
可以把两个.c 生成对应的.o文件随后链接
$gcc hello_world.c hello.c -o hello_world
但文件少还可以手敲,如果文件很多生成很多可执行文件的话怎么办。编译个工程会十分繁琐。
这时就可以借助Makefile文件,依据规则来自动编译文件
同样是这两个文件,可以这样写Makefile
/*****************Makefile*****************/
#定义变量
OUT_FILENAME = hello_world$(object) = hello_world.o hello.o #\
$(变量) 代表引用变量\
make工具管理项目是逆序的\
XXX:XXX 目标:依赖\
CC 代表编译器
$(OUT_FILENAME): $(object)$(CC) -o $@ $^
#\
gcc hello.o hello_world.o -o hello_world%.o: %.c $(CCC) -c $< -o $@
#\
gcc -c hello_world.c -ohello_world.o\
gcc -c hello.c -o hello.o# \
$@ 表示目标文件(集)\
$^ 表示所有的依赖文件\
$< 表示第一个依赖文件\
$? 表示比目标还要新的依赖文件列表\#执行make clean会清除当前目录下所有.o和hello_world文件
clean:-rm -rf ./*.o ./hello_world
这样我们敲一下
$ make
就会自动生成hello_world可执行文件,执行结果
fuhuizhong@ubuntu:~/work/Test/TEST/exercise/hello_world$ make clean
rm -rf ./*.o ./hello_world
fuhuizhong@ubuntu:~/work/Test/TEST/exercise/hello_world$ make
cc -c hello_world.c -o hello_world.o
cc -c hello.c -o hello.o
cc -o hello_world hello_world.o hello.o
fuhuizhong@ubuntu:~/work/Test/TEST/exercise/hello_world$ ./hello_world
int main : hello_world!
in hello : hello_world!
fuhuizhong@ubuntu:~/work/Test/TEST/exercise/hello_world$
那么有一个新的问题,我的头文件,源文件不一样怎么办。他三个分布在各处怎么办。
那么:
.PHONY: clean runcc = g++RM = -rm -rfsrcpp = $(wildcard ./src/*.cpp)
object = $(patsubst %.cpp, %.o, $(srcpp))inc = ./incCFLAGS := \-I $(inc) \
#X为编译条件
X := \-lpthread\BIN_NAME = fhz_test$(BIN_NAME): $(object)$(CXX) $( CFLAGS) -o $@ $(object) $(X)
#g++
%.o: %.cpp$(CXX) $(CFLAGS) -c $< -o $@run: ./$(BIN_NAME)clean:$(RM) ./src/*.o $(BIN_NAME)#\
CXX = c++编译器#\
$(patsubst <pattern>,<replacement>,<text>) \
查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔\
是否符合模式<pattern>,\
如果匹配的话,则以<replacement>替换。\
返回:函数返回被替换过后的字符串#\
$(wildcard <text>)\
返回含有<text>文件名的列表#\
$(BIN_NAME):$(object)\
$(目标):$(需要依赖的条件)\#\
gcc 输入文件 -o 输出文件\
-c 只编译生成中间同名目标文件,不链接\
-o 指定输出文件名,该文件为可执行文件\
可以是一个文件,也可以是一组文件# \
$@ 表示目标文件(集)\
$^ 表示所有的依赖文件\
$< 表示第一个依赖文件\
$? 表示比目标还要新的依赖文件列表\#@符号\@echo --compiling module----
# 屏幕输出 --compiling module----\echo --compiling module----; \没有@ 屏幕输出echo --compiling module---- \ #\
-符号\通常删除,创建文件如果碰到文件不存在或者已经创建,\那么希望忽略掉这个错误,继续执行,就可以在命令前面添加 -#\
$符号\主要扩展打开makefile中定义的变量#\
$$符号\主要扩展打开makefile中定义的shell变量
这样的话Makefile所在路径下的./src存放源文件./inc路径下存放头文件。生成的可执行文件会和Makefile生成在同意目录下,不需要在意有多少头文件和源文件。
到此为止一个简单的Makefile文件就写好了
#图非原创得到许可
初学者囫囵吞枣急速编写简单Makefile相关推荐
- c语言编译流程简单整理以及简单makefile编写
c语言编译流程简单整理以及简单makefile编写 前言: 最近接触了makefile.为了学习makefile,就去了解了部分需要的知识,目前先简单的整理在这里. c语言编译过程 C语言在编译过程中 ...
- C语言eigen存为txt文件,如何为使用Eigen(C线性代数的模板库)的C项目编写一个makefile?...
我正在使用特征库,它承诺矩阵运算的矢量化.我不知道如何使用Eigen中给出的文件并编写一个makefile.使用Eigen的源文件包括下面列出的文件,这些文件甚至不是头文件(它们只是一些文本文件) – ...
- ubuntu系统中用c语言编写简单程序
目录 (一):修改参数提高下载速度 (二):c语言入门编写helloworld (三):在ubuntu系统下编写简单程序 (四):在windows系统下编写简单程序 (五):在ubuntu系统下使用m ...
- ubuntu系统下c语言入门以及编写简单程序
目录 一,hello world入门 二,在windows系统中编写简单程序 三,在ubuntu系统下用makefile方式编写程序 一,hello world入门 在linux操作系统中打开终端 1 ...
- ubuntu系统下C语言编写简单程序
文章目录 一.学习了解ubuntu系统下vim编辑器的基本运用. 1.如何进入vim编辑器 2.vim编辑器命令模式基本命令 3.vim编辑器编辑模式 4.vim编辑器末行模式命令 二.ubuntu系 ...
- 用c++编写简单的加减乘除
初学者尝试编写简单的加减乘除运算 ...
- 针对初学者以 MQL5 编写“EA 交易”的分步指南
简介 本文的目标受众是想要学习如何以全新的 MQL5 语言编写简单"EA 交易"的初学者.首先,我们将定义我们的 EA(EA 交易)的功能,接下来是 EA 如何实现这些功能. 1. ...
- kubebuilder实践笔记(4) - 编写简单的业务逻辑
今天使用kubebuilder,在一个Controller中编写简单的业务逻辑. 需求: 1)实现自定义对象(ats/at-sample)的状态(Status.Phase字段)的转换:PENDING& ...
- 初学者用什么编写c语言_编写初学者级教程
初学者用什么编写c语言 I've been writing books and articles for around ten years. However, like most of us who ...
最新文章
- (转)JS之——解决IE6、7、8使用JSON.stringify报JSON未定义错误的问题
- dac0832产生梯形波程序C语言,在8086系统中用DAC0832输出一个三角波,一个梯形波,和一个正弦波。...
- 数据库事务的四大特性ACID
- 趣学python3(6)-条件语句
- C++中如何定义某个数组的引用?
- Maven 配置文件 POM 的常用插件配置代码
- python直方图的拟合_从一组数据python中将两个高斯拟合成直方图
- java怎么写事件listener_java 事件监听器ActionListener
- Qt工作笔记-动态折线图(x轴坐标会改变)
- 收银系统服务器有什么好处,生鲜超市收银系统软件怎么选?收银系统能带来什么好处?...
- 心跳超时时间设置_定时器实现之时间轮算法
- srsLTE源码学习:生成多播信道表gen_mch_tables
- python directx_directX嵌入pyside
- Java数据库的介绍和使用
- Unity中实现列表中元素随机排序
- Java分销商城微商城源码跨境电商介绍B2B2C系统
- UWP开发入门(八)——聊天窗口和ItemTemplateSelector
- 手机开热点但是电脑一直连接不上_电脑连不上wifi,手机可以连上。手机开热点,电脑可以连上。这是怎么回事,电脑就一直循环连接那个w...
- Macbookpro开机只能进入恢复模式后的解决方案(过程太戏剧性了有时间可以看完)
- 机器人硬汉 聆听_第268章 百拳机器人
热门文章
- 主子式、顺序主子式、余子式、代数余子式
- ZYNQ学习之路9.USB总线学习(二)
- 微软工程院 硕士_微软工程院招聘NLP算法研究员实习生|NLP算法工程师实习生_北京实习招聘...
- C语言 printf() 函数,总结笔记记录
- 使用OAuth2的SSO分析
- 小学计算机水平测试论坛,热烈祝贺我校学生在市计算机水平测试中再创佳绩
- python个性化推荐系统毕业设计_个性化推荐系统架构设计(一)
- 《 观沧海》 《忆秦娥 · 娄山关 》
- ios iPhone的 自带输入法emoji编程
- 【Java开发】 Spring 09 :Spring Data REST 实现并访问简单的超媒体服务