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相关推荐

  1. c语言编译流程简单整理以及简单makefile编写

    c语言编译流程简单整理以及简单makefile编写 前言: 最近接触了makefile.为了学习makefile,就去了解了部分需要的知识,目前先简单的整理在这里. c语言编译过程 C语言在编译过程中 ...

  2. C语言eigen存为txt文件,如何为使用Eigen(C线性代数的模板库)的C项目编写一个makefile?...

    我正在使用特征库,它承诺矩阵运算的矢量化.我不知道如何使用Eigen中给出的文件并编写一个makefile.使用Eigen的源文件包括下面列出的文件,这些文件甚至不是头文件(它们只是一些文本文件) – ...

  3. ubuntu系统中用c语言编写简单程序

    目录 (一):修改参数提高下载速度 (二):c语言入门编写helloworld (三):在ubuntu系统下编写简单程序 (四):在windows系统下编写简单程序 (五):在ubuntu系统下使用m ...

  4. ubuntu系统下c语言入门以及编写简单程序

    目录 一,hello world入门 二,在windows系统中编写简单程序 三,在ubuntu系统下用makefile方式编写程序 一,hello world入门 在linux操作系统中打开终端 1 ...

  5. ubuntu系统下C语言编写简单程序

    文章目录 一.学习了解ubuntu系统下vim编辑器的基本运用. 1.如何进入vim编辑器 2.vim编辑器命令模式基本命令 3.vim编辑器编辑模式 4.vim编辑器末行模式命令 二.ubuntu系 ...

  6. 用c++编写简单的加减乘除

    初学者尝试编写简单的加减乘除运算                                                                                    ...

  7. 针对初学者以 MQL5 编写“EA 交易”的分步指南

    简介 本文的目标受众是想要学习如何以全新的 MQL5 语言编写简单"EA 交易"的初学者.首先,我们将定义我们的 EA(EA 交易)的功能,接下来是 EA 如何实现这些功能. 1. ...

  8. kubebuilder实践笔记(4) - 编写简单的业务逻辑

    今天使用kubebuilder,在一个Controller中编写简单的业务逻辑. 需求: 1)实现自定义对象(ats/at-sample)的状态(Status.Phase字段)的转换:PENDING& ...

  9. 初学者用什么编写c语言_编写初学者级教程

    初学者用什么编写c语言 I've been writing books and articles for around ten years. However, like most of us who ...

最新文章

  1. (转)JS之——解决IE6、7、8使用JSON.stringify报JSON未定义错误的问题
  2. dac0832产生梯形波程序C语言,在8086系统中用DAC0832输出一个三角波,一个梯形波,和一个正弦波。...
  3. 数据库事务的四大特性ACID
  4. 趣学python3(6)-条件语句
  5. C++中如何定义某个数组的引用?
  6. Maven 配置文件 POM 的常用插件配置代码
  7. python直方图的拟合_从一组数据python中将两个高斯拟合成直方图
  8. java怎么写事件listener_java 事件监听器ActionListener
  9. Qt工作笔记-动态折线图(x轴坐标会改变)
  10. 收银系统服务器有什么好处,生鲜超市收银系统软件怎么选?收银系统能带来什么好处?...
  11. 心跳超时时间设置_定时器实现之时间轮算法
  12. srsLTE源码学习:生成多播信道表gen_mch_tables
  13. python directx_directX嵌入pyside
  14. Java数据库的介绍和使用
  15. Unity中实现列表中元素随机排序
  16. Java分销商城微商城源码跨境电商介绍B2B2C系统
  17. UWP开发入门(八)——聊天窗口和ItemTemplateSelector
  18. 手机开热点但是电脑一直连接不上_电脑连不上wifi,手机可以连上。手机开热点,电脑可以连上。这是怎么回事,电脑就一直循环连接那个w...
  19. Macbookpro开机只能进入恢复模式后的解决方案(过程太戏剧性了有时间可以看完)
  20. 机器人硬汉 聆听_第268章 百拳机器人

热门文章

  1. 主子式、顺序主子式、余子式、代数余子式
  2. ZYNQ学习之路9.USB总线学习(二)
  3. 微软工程院 硕士_微软工程院招聘NLP算法研究员实习生|NLP算法工程师实习生_北京实习招聘...
  4. C语言 printf() 函数,总结笔记记录
  5. 使用OAuth2的SSO分析
  6. 小学计算机水平测试论坛,热烈祝贺我校学生在市计算机水平测试中再创佳绩
  7. python个性化推荐系统毕业设计_个性化推荐系统架构设计(一)
  8. 《 观沧海》 《忆秦娥 · 娄山关 》
  9. ios iPhone的 自带输入法emoji编程
  10. 【Java开发】 Spring 09 :Spring Data REST 实现并访问简单的超媒体服务