Linux下多个.c文件的编译和Makefile文件
在编程的时候,我们可以把一个完整程序的每个函数分离出来,写成.c文件,最后再一起编译和链接。这样有利于程序功能模块化,也方便检查代码错误。
.h文件:里面编辑该程序需要引用的头文件。
#ifndef /#define / #endif : 防止该头文件被重复引用。
整体用法:
#ifndef A_H //如果没有a.h文件,#define A_H。如果有,结束定义
#define A_H //定义a.h文件
定义a.h需要的头文件
#endif //结束定义部分
例子:
一个.h文件的书写格式。
#ifndef A_H
#define A_H
|
定义程序所需的一些头文件 |
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
…
#endif
保存退出。
其实在编写小程序的时候也可以不用#ifndef /#define / #endif,但是用它更安全,不易出错。
.c文件的书写格式
在写每个函数之前要加载头文件,如果是.h文件,就需要写#include”a.h”。
例如:引用之前的a.h文件。
add.c
#include”a.h”
int add(int a,intb)
{
return a+b;
}
保存退出。
程序编辑完成之后,需要编译链接。
我们可以用gcc编译每个.c文件。如果有三个.c文件a.c、b.c、c.c,编译方法如下:
gcc a.c –o a.o //将三个.c文件编译成.o文件
gcc b.c -o b.o
gcc c.c -o c.o
gcc a.o b.o c.o –o all //将三个.o文件编译成一个可执行文件
./all //执行程序
例如:
test.h

add.c

main.c

编译:

执行:

如果我们有很多个.c文件,这个方法就不太好了,这时,我们提出Makefile文件。
Makefile:自动编译。先将每个.c文件的编译过程提前写在Makefile文件中,在运行程序时,系统直接用make命令使文件自动编译,提高效率。
Makefile文件的书写格式:
vim Makefile
文件类型:由哪个文件得到
得到过程
例如:
main:main.o //可执行文件main是由目标文件main.o得到。
gcc main.o –o main //得到过程是将main.o编译成main文件。
main.o:main.c
gcc -c main.c -o main.o
在Makefile文件中一定要将每一个.c文件按执行顺序先编译成.o文件,再按顺序将.o文件编译成可执行文件。
每次编译过后会产生很多的.o文件,对于程序运行没什么太大意义,反而会占内存,所以我们也可以在Makefile文件中添加清除命令(clean),如:
.PHONY:clean
clean: 删除所有文件类型为.o的文件
rm –rf *.o
一些文件也可用下面符号表示:
$@: 代表规则里面的目标文件。
$<:代表规则当中的第一个依赖文件。
%.c:%.o 所有.c文件全部编译成.o文件
.PHONY:clean
如果有.PHONY:clean,外面也有clean文件,执行make clean时,里面的.o文件会被删除而外面的clean文件还在。确保了外面clean文件的安全性。如果没有.PHONY:clean 语句,外面也没有clean文件时,在执行make clean也会删除.o文件,如果外面有clean,则会报错。
PHONY:目标并非实际的文件名,只是显示在请求时执行命令的名字。有两种理由需要使用PHONY目标:避免和文件名冲突,改善性能。
例如:
vim Makefile

编译和执行(make:编译, ./all:执行):

Linux下多个.c文件的编译和Makefile文件的更多相关文章
- 在Linux下安装PHP过程中,编译时出现错误的解决办法
在Linux下安装PHP过程中,编译时出现configure: error: libjpeg.(a|so) not found 错误的解决办法 configure: error: libjpeg.(a ...
- Linux下C程序的编辑,编译和运行以及调试
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
- LINUX下C语言编程调用函数、链接头文件以及库文件
LINUX下C语言编程经常需要链接其他函数,而其他函数一般都放在另外.c文件中,或者打包放在一个库文件里面,我需要在main函数中调用这些函数,主要有如下几种方法: 1.当需要调用函数的个数比较少时, ...
- Linux下如何查看tomcat是否安装、启动、文件路径、进程ID
Linux下如何查看tomcat是否安装.启动.文件路径.进程ID 在Linux系统下,Tomcat使用命令的操作! 检测是否有安装了Tomcat: rpm -qa|grep tomcat 查看Tom ...
- linux下保存下位机输出的串口信息为文件
linux下保存下位机输出的串口信息为文件 1.stty -F /dev/ttyUSB0 raw (转换成raw模式) 2.stty -F /dev/ttyUSB0 speed 115200 (设置波 ...
- Linux下使用matlab在后台默默的运行.m文件(无界面形式)
Linux下使用matlab在后台默默的运行.m文件(无界面形式)本主在Ubuntu18.04LTS上已经安装了matlab直接运行Matlab$ matlab会启动 matlab,出现启动界面但想要 ...
- Linux下C语言多文件的编译以及makefile的应用
1.关于编译和链接 一般来说,无论是C.C++,首先要把源文件编译成中间代码文件,在Windows下也就是.obj文件,UNIX下是.o文件,即Object File,这个动作叫做编译(compile ...
- Linux下MySQL 5.6.24的编译安装与部署
MySQL 5.6正式版发布了,相对于5.5版本作出了不少改进,其源码安装配置方式也有所变化,本文根据实际操作,不断尝试,精确还原了安装的具体步骤. 在Linux下安装MySQL前,先确认卸载系统自带 ...
- linux下开发,解决cocos2d-x中编译出现的一个小问题, undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'
解决cocos2d-x中编译出现的一个小问题 对于cocos2d-x 2.×中编译中,若头文件里引入了#include "cocos-ext.h",在进行C++编译的时候会遇到例如 ...
随机推荐
- 使用jQuery模拟Google的自动提示效果
注意: 1.本功能使用SqlServler2000中的示例数据库Northwind,请打SP3或SP4补丁:2.请下载jQuery组件,河西FTP中有下载:3.本功能实现类似Google自动提示的效果 ...
- imx6 MfgTool分析
解析freescale的MfgTool中的脚本,了解imx6, android系统的分区情况. 配置文件 1. cfg.ini [profiles] chip = MX6DL Linux Update ...
- 第二百六十二节,Tornado框架-cookie
Tornado框架-cookie Cookie 是网站用来在客户端保存识别用户的一种小文件.一般来用库可以保存用户登 录信息.购物数据信息等一系列微小信息. self.set_cookie()方法,创 ...
- 【BZOJ】1685: [Usaco2005 Oct]Allowance 津贴(贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=1685 由于每个小的都能整除大的,那么我们在取完大的以后(不超过c)后,再取一个最小的数来补充,可以证 ...
- java基础知识总结8(数据库篇1)
一. Oracle的安装(windowXP.win7.Linux)和卸载 1.1 Oracle的安装 1.1.1 在WindowsXP.Win7下安装 第一:解压win32_11gR2_databas ...
- PHP时间戳 strtotime()使用方法和技巧
在php中我想要获取时间戳有多种方法,最常用的就是使用time函数与strtotime()函数把日期转换成时间戳了, 下面我来给大家分享一下时间戳函数 strtotime用法. 获取指定的年月日转化为 ...
- VS2008链接错误fatal error LNK1104: cannot open file '*.obj'
This particular issue is caused by specifying a dependency to a lib file that had spaces in its path ...
- 编程之美 set 8 区间重合判断
Leetcode 上有连续的两道题, 一个是 insert interval, 一个是 merge interval, 其中 insert interval 是 merge interval. 其中 ...
- PHP 预定义超全局数组/变量
1.超全局变量:不用定义声明即可用.PHP有九种 2.$_GET:通过参数传递给当前脚本的变量的数组 浏览器页面-->(http协议)->apache-->php module--& ...
- 数据集划分——train set, validate set and test set
先扯点闲篇儿,直取干货者,可以点击这里. 我曾误打误撞的搞过一年多的量化交易,期间尝试过做价格和涨跌的预测,当时全凭一腔热血,拿到行情数据就迫不及待地开始测试各种算法. 最基本的算法是技术指标类型的, ...