1.c/c++语言默认是支持标准输入输出库的,但是其他相关函数需要第三方引入,并且,编译程序时,需要链接上
2.使用数学库:#include<math.h>
3.线程支持类库:#include<pthread.h>
如果不能支持线程库:sudo yum install manpages-posix manpages-posix-dev
Makefile文件与Cmake文件
1.什么是Makefile
用于工程项目管理的文本文件,文件名为makefile的文件名
makefile可以大写,也可以小写,一般Makefile首字母使用大写
如果makefile和Makefile两个文件都存在一般使用小写
代码:all:
@iecho "Makefile success"
@隐藏这一行字
2.什么是make
执行makefie的工具,是一个解释器
用来对makefile中的指令进行解析并执行一个shell指令
make这个指令在 /usr/bin 中,默认linux系统中都以及安装
如果没有安装make,安装指令如下
sudo yum install make
查看是否安装成功:make --version
3.makefile的用途
描述了整个工程的编译、链接规则
软件项目的自动化编译,相当于给软件编译写一份脚本文件
4.学习makefile的必要性
linux/unix环境下开发的必备技能
系统架构师、项目经理的核心技能
研究开源项目、linux内核源码的必需品
加深对底层软构造系统及过程的理解
5.如果学习makefile
1.理论基础
软件的构造过程、程序的编译和链接
面向依赖的思想:
依赖一个.cpp文件的程序
可执行程序 <--依赖于--.o文件<--依赖于--.s文件<--依赖于--.i文件<--依赖于--.cpp文件
依赖于多个.cpp文件
可执行程序 <--依赖于--.o文件<--依赖于--.s文件<--依赖于--.i文件<--依赖于--.cpp文件
可执行程序 <--依赖于--.o文件<--依赖于--.s文件<--依赖于--.i文件<--依赖于--.cpp文件
可执行程序 <--依赖于--.o文件<--依赖于--.s文件<--依赖于--.i文件<--依赖于--.cpp文件
2.项目编程基础
c++程序语言基础
c语言基础
多文件源码管理、头文件包含、函数声明与定义
6.makefile的工作过程
makefiel本身是面向依赖进行编写的
源文件 --->编译 --->目标文件 --->链接 --->可执行文件--->hello.cpp--->hello.o --->hello
本质上一步就可以生成可执行程序,但是,由于在生成可执行程序时,可能会有多个文件进行参与,后期其他文件可能要进行更改,更改后,会影响到可执行程序的执行,其他没有更改的文件也要参加编译,浪费时间
7.第一个makefie
1.编写一个hello.cpp文件
#include<iostream>
#include<stdio.h>
using namespace std;
int main(int argc,const char *argv[])
{
cout<<"hellp world"<<endl;
return 0;
}
2.通过终端编译程序
3.使用makefile管理工程
编写makefile文件
简化的make文件
4.执行Makefile文件
make --->默认找到Makefile中的第一个目标开始进行执行
make 目标 ---> 找到对应的目标进行执行
8.makefile的语法规则
1.规则
构成makefile的基本单元,构成依赖关系的核心部件
其他内容可以看作为规则的服务
2.变量
类似于c++中的宏,使用变量$(变量名)或则$(变量名)
作用:使得Makefile更加灵活
3.条件执行
根据某一变量的值来控制make执行或者忽略makefile的某一部分
4.函数
文本处理函数:字符串的替换、查找、过滤等待
文件名的处理:读取文件/目录名、前后缀等待
5.注释
Makefile中的注释,是以#号开头
9.规则
1.规则的构成:目标、目标依赖、命令
2.语法格式
目标:目标依赖
命令
注意事项:
命令必须用tab键开头,一般时shell指令
一个规则中,可以无依赖,仅仅是实现某种操作
一个规则中可以没有命令,仅仅描述依赖关系
一个规则,必须要有一个目标
3.目标详解
1.默认目标
一个makefile里面可以有多个目标,一般会选择第一个当做默认目标
也就是make默认执行的目标
2.多目标
一个规则中可以有多个目标,多个目标具有相同的生成命令和依赖文件
clean distclean:
rm hello.[^cpp] hello
3.多规则目标
多个规则可是同一目标
all:test1
all:test2
test1:
echo"hello"
test2:
echo"world"
4.伪目标
并不是一个真正的文件,可以看做以一个标签
无依赖,相比一般文件,不会重新生成,执行
伪目标:可以无条件执行,相当于对应的指令
eg:
.PHONY:clean
clean:
rm hello.[ ^cpp]hello
4.目标依赖
1.文件时间戳
根据时间戳来判断目标依赖是否进行更新
所有文件都更改过,则对所有文件进行编译,生成可执行程序
在上次make之后修改过的cpp文件,会被重新编译
在上次make只写修改过的头文件,依赖该头文件的目标依赖也会重新编译
2.匹配模式
% ---->通配符匹配
$@ ---->目标
$^ ---->依赖
$< ---->第一个依赖
* ---->普通通配符
注意:%是makefile中的规则通配符,*是普通通配符
5.命令
1.命令的组成
由shell命令组成,以tab键开头
2.命令的执行
每条命令,make公开一个进程
每条命令执行完,make会检测这个命令的返回码
如果返回成功,则继续执行后面的命令
如果返回失败,则make终止当前执行的规则并退出
3.并发执行命令
make -j4 ---->表示开辟4个线程执行
time make ---->执行make时,显示当前时间
10.变量
1.变量定义
1.变量定义:变量名=变量值
2.变量的赋值
追加赋值:+= --->在原有的基础上追加相关内容
条件赋值:?= --->如果之前没有值,则为变量赋值,如果之前有值,则不进行赋值
3.变量的使用: $(变量名)或者${变量名}
2.变量的分类
1.立即展开变量
使用::=操作符进行赋值
在解析阶段直接赋值常量字符串
2.延迟展开变量
使用:=操作符进行赋值
最后一次赋值的结果个给变量名使用
3.注意事项
一般在目标、目标依赖中使用立即展开赋值
在命令中一般使用延迟展开赋值变量
3.变量的外部传递
可以通过命令行给变量进行赋值操作
make ARCH=g++
11.条件执行
1.关键字
ifeq 、 else 、enfid
ifneq、 else 、endif
2.使用
ifeq(要判断的量,判断的值)
makefile语句
else
makefile语句
endif
注意:
条件语句从ifeq开始执行,括号与关键字减使用空格隔开
括号里面挨着括号处,不允许加空格
12.总结
1,执行过程
进入编译目录,执行make命令
依赖关系解析阶段
命令执行阶段
2.依赖解析阶段
机械makefile,建立依赖关系树
控制解析过程,引入makefile,变量展开,条件执行
生成依赖关系
3.命令执行阶段
把解析生成的依赖关系树加载到内存
按依赖关系,按顺序神生成这些文件
再次编译make会检测文阶段时间戳,判断是否过期
如果无过期,在不在编译
如果文件有更新,则依赖该该文件所有依赖关系上的目标都会重新编译
4.make执行结果
make的退出码
0:表示成功执行
1:表示允许错误,推出