C++关于Makefile的详解含通用模板

介绍

Makefile是一个规定了怎么去编译和链接程序的脚本文件,在执行make命令时会执行该文件,window环境下的IDE,如visual studio已经集成了该功能,不需要关心程序的编译规则,在linux下做C/C++开发时经常用到,说到这里首先要知道一个工具make。

make是一个解释Makefile中指令的命令工具,常见的IDE都集成了这个工具。目前centos 7.3 GNU的make版本是3.82

规则

目标文件:依赖文件

[Tab]系统指令1     (注意:系统指令前必须有tab)

使用

3.1 简单使用

现有文件main.cpp  test.cpp test.h三个文件,说些Makefile实现增量编译(当其中有一个文件变化时,重新编译该文件)

helloworld: main.o test.o
  g++ main.o test.o -o helloworld
main.o: main.cpp test.h
  g++ -c main.cpp -o main.o
test.o: test.cpp test.h
  g++ -c test.cpp -o test.o
clean:
  rm *.o helloworld

3.2 makefile中使用注释,变量和函数

注释:

行前面加"#"号,如#g++ main.o test.o -o helloworld  表示注释了该行

变量:

  • 用=定义一个变量,并且赋值(等号两边可以加空格)
  • 用+=追加字符串
  • 用$(A)来取得变量的值

例:

A = src
  echo $(A)
  @echo $(A) ##只输出echo的结果,不显示执行的命令

特殊变量:

  • $@ 目标文件
  • $^ 依赖项列表
  • $< 依赖项列表第一项

函数:

Makefile中有一些预定义函数,形式:

$(函数名 参数列表)
    参数列表:以逗号分隔
    函数名和参数之间用空格分开

#获取当前目录路径
    PWD = $(shell pwd)

#获取当前目录下所有.cpp文件
    CXX_SOURCES = $(wildcard *.cpp)

#获取当前目录下所有.cpp文件编译后的所有目标文件.o
    CXX_OBJECTS = $(patsubst *.cpp *.o, $(CXX_SOURCES))

3.3 优化3.1中Makefile

EXE = helloworld
GCC = g++
$(EXE): main.o test.o
    $(GCC) $^ -o $(EXE)
main.o: main.cpp test.h
    $(GCC) -c $< -o $@
test.o: test.cpp test.h
    $(GCC) -c $< -o $@
clean:
    rm *.o $(EXE)

3.4 优化3.3中Makefile

继续优化Makefile,添加文件夹,把源码都放入src和lib文件夹,保持增量编译,即为Makefile通用模板

EXE = helloworld
GCC = g++
SUBDIR = src lib
CPP_SOURCES = $(foreach dir, $(SUBDIR), $(wildcard $(dir)/*.cpp))
CPP_OBJECTS = $(patsubst %.cpp, %.o, $(CPP_SOURCES))
DEP_FILES = $(patsubst %.o, %.d, $(CPP_OBJECTS))
$(EXE): $(CPP_OBJECTS)
    $(GCC) $(CPP_OBJECTS) -o $@
%.o: %.cpp
    $(GCC) -c -MMD $< -o $@
-include $(DEP_FILES)
clean:
    rm $(CPP_OBJECTS) $(EXE)

此Makefile可以作为通用Makefile模板来编译C/C++项目,欢迎收藏

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • Python使用paramiko操作linux的方法讲解

    paramiko介绍 paramiko是一个基于python编写的.使用ssh协议的模块,跟xshell和xftp功能类似,支持加密与认证,可以上传下载和访问服务器的文件. 可以利用paramiko模块写服务器脚本,在本地执行,比如持续更新代码,查看日志,批量配置集群等. paramiko 主要包含SSHClient和SFTPClient两个组件: SSHClient ssh服务会话的表示,通常用来执行命令,主要有connect.exec_command.load_system_host_key

  • 使用autoconf生成Makefile并编译工程的步骤

    前言 在Linux下,编译和链接需要用Makefile,而写好一个Makefile可不容易,写出一个规范的Makefile更是麻烦.我们可以利用autoconf来生成一个Makefile,尤其在大型工程里,能省去很多麻烦. 这里我会用一个工程来说明怎么做,有一些步骤不是必须的,但是如果你看不出来哪些步骤不是必须的,最好跟着一步步走,因为某些步骤省略了,代码也需要做出相应修改(如修改路径等). 步骤 首先安装autoconf sudo apt-get install autoconf 新建一个项目

  • pyqt远程批量执行Linux命令程序的方法

    写了个小程序: 功能 1.测试远程ssh连接是否成功, 2.批量执行远程ssh命令 效果如下: 代码如下: #-*- coding:utf-8 -*- import sys from PyQt4 import QtCore, QtGui, uic import locale import re import os from PyQt4.QtCore import * from PyQt4.QtGui import * import paramiko qtCreatorFile = "test.u

  • Makefile/cmake/node-gyp中区分判断不同平台的方法

    最近用QTK开发一个下载(下载到开发板)工具,同时用到了Makefile/cmake和node-gyp,而且都要针对不同平台做不同的处理.这里做个记录,以备以后有需要时查阅. Makefile 在Makefile中,可以用OS变量判断当前系统是否是Windows,然后用uname来判断当前系统是MacOS还是其它系统. ifeq ($(OS),Windows_NT) PLATFORM="Windows" else ifeq ($(shell uname),Darwin) PLATFOR

  • Linux shell环境下Zabbix Api的使用

    在linux shell环境下直接调用就可以,根据官网所述:在访问Zabbix中的任何数据之前,你需要登录并获取身份验证令牌.这可以使用该 user.login 方法完成. [root@localhost ~]# curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc": "2.0","method":"user.login","params

  • Android之在linux终端执行shell脚本直接打印当前运行app的日志的实现方法

    1.问题 我们一般很多时候会需要在ubuntu终端上打印当前运行app的日志,我们一般常见的做法是 1).获取包名 打开当前运行的app,然后输入如下命令,然后在第一行TASK后面的就可以看到包名 adb shell dumpsys activity top 2).我们的终端安装了pidcat.py脚本,然后执行如下的命令就可以打印当前运行app的全日志, pidcat.py packageName 3).思考,为什么每次都需要这样重复的操作呢?一说到重复,我们应该立马想到是否可以用脚本解决重复

  • Linux shell数组与关联数组的用法实例

    1. 关联数组 使用 declare -A(declare 的用法请使用 help 进行查看,help declare) 进行声明关联数组变量: $ declare -A fruits_price $ fruits_price=([apple]='$100' [orange]='$150') 列出关联数组的索引(也就是 key): $ echo ${!fruits_price[*]} $ echo ${!fruits_price[@]} 2. 序列数组 seq 方法创建 基本用法: $ a_nu

  • Linux两台服务器之间传输文件和文件夹操作步骤

    今天处理一个项目要迁移的问题,突然发现这么多图片怎么移过去,可能第一时间想到的是先从这台服务器下载下来,然后再上传到另外一台服务器上面去,这个方法确实是可行,但是实在是太费时间了,今天我就教大家怎么快速的在两台服务器之间传输文件和文件夹. 第一步:打开我们的远程连接工具,输入账号密码登录到服务器,如图: 点击文件打开或者新建一个会话,新建会话输入主机的ip和账号密码即可,如果已经登录过,直接点击文件下面那个带+号的图标就可以了. 第二步:找到你要传输的文件或者文件夹: 这里有这么多图片,我随便传

  • Linux中文件/文件夹无法删除的解决方案

    前言 最近我们的服务器被黑客攻击,然后有些文件的属性被修改,导致我们无法删除病毒文件,同时采用 root 用户也无法删除,现在把解决方案记录下来. 普通删除 如果文件是当前用户的,那么使用 rm 命令就可以删除 rm -rf file.sh 如果无法删除,则尝试使用 root 用户删除,如果无法删除那么请看下面的说明. 需要了解的命令 如果普通的删除方式没有用,那么我们需要了解下面的命令来进行删除 lsattr lsattr 命令用于显示文件的属性,使用方式如下 # 列出 file.sh 文件的

  • linux查找当前python解释器的位置方法

    先进入python 输入 import sys sys.executable 即可! 以上这篇linux查找当前python解释器的位置方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

随机推荐