一个通用的makefile写法,自动推导文件的依赖关系

温习之用。

    假设有两个头文件目录 header1,header2;两个cpp文件目录,src1,src2,一个lib目录

 写一个完整的makefile步骤如下:

1 定义可执行文件的名称

 TARGET =MyPro               

2 指定此编译工程所要使用的头文件所在的目录

 INC = -I. -Iheader1 -Iheader2

3 指定cpp文件所在的目录

 VPATH = .:src1:src2

4 指定所有的cpp文件

   SRC_PATH = $(foreachdir,$(subst :, ,$(VPATH)),$(wildcard $(dir)/,*.cpp))

 解释:

 foreach,subst,wildcard为makefile的内置函数,其中wildcard函数为字符串连接函数,把函数中的两个参数连接成一个subst是字符串替换函数,在此句中意思是把VPATH变量中的冒号替换成空格。foreach函数,就是把subst函数的返回值,以空格为分隔符,循环取值赋给dir,然后接受wildcard的处理

 这句的总体意思是:从VPATH中获取每个目录,并分别找出此目录下所有的cpp文件,赋给SRC_PATH变量。

5 定义中间object文件存放的目录。

 OBJ_DIR = ./obj

6 所有的object文件要按照和源代码对应的目录存放,定义object文件的目录

 OBJ_PATH = $(addprefix $(OBJ_DIR)/,   $(subst :,,$(VPATH) )  )

 解释:

 addprefix函数是加前缀的函数,词句中是给VPATH中所有已经定义的目录加上./obj/的前缀

7 定义连接成目标文件所需要的所有的object文件的名称

 OBJS = $(addprefix $(OBJ_DIR),$(subst.cpp,.o,$(SRC_PATH)))

8 创建一个object文件的目录

 MAKE_OBJECT_DIR := $(shell mkdir -p $(OBJ_DIR)$(OBJ_PATH))

 

 

************************* 

9 定义实用的编译器

 CXX = g++

 CXXFLAGS = -g

10 定义目标文件的生成规则

 $(TARGET) : $(OBJS)

  $(CXX) -o $@ $(OBJS) $(INC)$(CXXFLAGS)

11 定义object文件的生成方式:

 $(OBJ_DIR)/%.o : %.cpp%.cpp.d

  $(CXX) -o $@ -c$< $(INC) $(CXXFLAGS)

12 定义.cpp.d文件的生成方式

 DEPS = $(OBJS:.o=.cpp.d)

 $(DEPS) : $(OBJ_DIR)/%.cpp.d : %.cpp

  $(CXX) $< -MM$(INC) > $(OBJ_DIR)/$<.d

13 定义清理函数

 clean:

    @rm -rf./obj

    @rm -rf$(TARGET)

   至此,一个通用的makefile完成了,如果增加源代码目录和头文件目录,只需要在INC变量和VPATH变量处加上此目录即可。中间object文件和文件的依赖关系自动生成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现基于darknet框架实现CTPN版本自然场景文字检测 与CNN+CTCOCR文字识别的ChineseOCR搭建

Github地址 Github源码地址 支持系统:mac/ubuntu python3.6 实现功能 文字检测&#xff1b; 文字识别&#xff1b; 支持GPU/CPU&#xff0c;CPU优化&#xff08;opencv dnn&#xff09; docker镜像服务&#xff08;CPU优化版本&#xff09; 下载镜像 链接:https://pan.baidu…

50个c/c++源代码网站

C/C是最主要的编程语言。这里列出了50名优秀网站和网页清单&#xff0c;这些网站提供c/c源代码。这份清单提供了源代码的链接以及它们的小说明。我已尽力包括最佳的C/C源代码的网站。这不是一个完整的清单&#xff0c;您有建议可以联系我&#xff0c;我将欢迎您的建议&#xff…

在服务器上搭建基于yolo3 与crnn 实现中文自然场景文字检测及识别,GPU版本

Github地址 参考地址作者大人&#xff0c;十分热心&#xff0c;对于我的问题&#xff0c;提供了大量的帮助&#xff0c;使我少走了很多的弯路&#xff0c;在此表示由衷的感谢 注意事项 使用nvidia-smi命令查看cuda的版本&#xff0c;必须是10.1或者10.0&#xff0c;10.2是万万…

python TypeError can only concatenate tuple not str to tuple

原因分析 这个错误出现是因为执行元组之间的合并例子 tuple1 ("str",1,["a","b","c"],4) tuple2 ("hello",) print(tuple1[0]) print (tuple1[1:3]) print (tuple1[1:]) print (tuple2 * 2) print (tuple1tuple2) 注意事…

23种设计模式 -比喻

1、FACTORY—追MM少不了请吃饭了&#xff0c;麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西&#xff0c;虽然口味有所不同&#xff0c;但不管你带MM去麦当劳或肯德基&#xff0c;只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory (下载源码就到源码网:…

python 版本2和3 在/取模方面的的差异

注意事项 python2 使用 /python3 使用 // 例子 二分法取数值 def binary_search(search_list,target):left 0right len(search_list) - 1while left < right:mid (left right) // 2if search_list[mid] < target:left mid 1continueif search_list[mid] target:r…

vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess

三个SDK函数: WinExec&#xff0c;ShellExecute &#xff0c;CreateProcess可以实现调用其他程序的要求&#xff0c;其中以WinExec最为简单&#xff0c;ShellExecute比WinExec灵活一些&#xff0c;CreateProcess最为复杂。WinExec 两个参数&#xff0c;前一个指定路径&#xf…

算法入门篇 一 时间复杂度

时间复杂度 要求&#xff1a;只要高阶项&#xff0c;不要低阶项常数操作&#xff1a;操作花费的时间和数据量无关&#xff0c;比如数组寻址&#xff0c;直接利用偏移量找到对应元素的位置&#xff1b;非常数操作&#xff1a;比如list(链表)&#xff1b;查找元素需要遍历链表&a…

遍历文件夹下所有文件和文件夹

1 void find(char * lpPath){char szFind[MAX_PATH];WIN32_FIND_DATA FindFileData;strcpy(szFind,lpPath);strcat(szFind,"*.*");HANDLEhFind::FindFirstFile(szFind,&FindFileData);if(INVALID_HANDLE_VALUE hFind)  return;while(TRUE){if(FindFileData.dw…

算法入门篇二 认识O(NlogN)的排序

递归 例子引出 使用递归的方法求出数组中的最大值&#xff08;利用的是栈&#xff09;求中点的方法改进 mid (left right) / 2 //但是如果left和right的数很大&#xff0c;相加会造成内容溢出 改进为 mid left (right - left) / 2 //(right - left)得到整个的长度&…

算法入门篇三 详解桶排序和整理排序知识 堆的相关操作 补充 不完整

归并排序不使用递归 使用一个变量&#xff0c;使其按照1、2、4、8递增&#xff0c;控制左右两边1个元素、2个元素、4个元素等元素的合并 完全二叉树 完全二叉树 要不全是满的&#xff0c;要不叶子节点出现在最后一层&#xff0c;只要出现了叶子节点&#xff0c;后面的都是叶子…

C++著名程序库

1、C各大有名库的介绍——C标准库标准库中提供了C程序的基本设施。虽然C标准库随着C标准折腾了许多年&#xff0c;直到标准的出台才正式定型&#xff0c;但是在标准库的实现上却很令人欣慰得看到多种实现&#xff0c;并且已被实践证明为有工业级别强度的佳作。 1.1、Dinkumware…

2023年12月24日学习总结

今日to do list&#xff1a; 做kaggle上面的流量预测项目☠️ 学习时不刷手机&#x1f921; okkkkkkkkkkkkkk 开始&#x1f44d;&#x1f34e; 0、我在干什么&#xff1f; 我在预测一个名字叫做elborn基站的下行链路流量&#xff0c;用过去29天的数据预测未来10天的数据 1、…

Mac/Linux系统连接远端服务器以及相同IP地址的服务器账号密码重置,ssh失败问题

连接远端服务器 ssh 账号IP地址 输入完成之后会提示输入密码&#xff0c;密码输入正确后&#xff0c;就可以连接成功了 重置ssh密钥 如果连接的服务器除了IP地址没有改变&#xff0c;其余的账号、密码、系统等都变了的话&#xff0c;因为曾经连接过的历史数据会保存到本地&a…

内存泄漏快速定位方法

主要方法&#xff1a;利用系统带的函数&#xff1a;EnableMemLeakCheck() 和函数重载&#xff0c;能快速准备的定位到内存泄漏的地方&#xff0c;方法简单且实用&#xff0c;值得借用。 #include <crtdbg.h> #ifdef_DEBUG //重载一下new函数&#xff0c;这样能得到使…

Linux操作系统监视NVIDIA的GPU使用情况

对于GPU相关参数介绍 使用命令周期性查看GPU运行情况最常用的参数是 -n&#xff0c; 后面指定是每多少秒来执行一次命令。监视显存&#xff1a;设置为每 1s 显示一次显存的情况&#xff1a;使用命令ctrlz退出 watch -n 1 nvidia-smi 参数介绍 Fan&#xff1a;显示风扇转速&am…

一个软件工程师的职业规划

[1]好好规划自己的路&#xff0c;不要跟着感觉走&#xff01;根据个人的理想决策安排&#xff0c;绝大部分人并不指望成为什么院士或教授&#xff0c;而是希望活得滋润一些&#xff0c;爽一些。那么&#xff0c;就需要慎重安排自己的轨迹。从哪个行业入手&#xff0c;逐渐对该行…

算法入门篇四 桶排序

桶排序 计数排序&#xff08;基于统计&#xff09; 要求数据是有限的&#xff0c;和数据状况有关&#xff0c;比如对于200个人统计他们的年龄分布&#xff0c;这个时候需要申请200个桶&#xff0c;因此对于输入数据的规模有限制&#xff0c;如果输入规模是不定的&#xff0c;…

RTP概述

1.1. RTP是什么 RTP全名是Real-time Transport Protocol&#xff08;实时传输协议&#xff09;。它是IETF提出的一个标准&#xff0c;对应的RFC文档为RFC3550&#xff08;RFC1889为其过期版本&#xff09;。RFC3550不仅定义了RTP&#xff0c;而且定义了配套的相关协议RTCP&…

Java需要注意的一些小细节

更加精确的锁定时间 判定纳秒维度的时间 //使用System.nanoTime(); //例子 long start System.nanoTime(); long end System.nanoTime(); System.out.println(start); System.out.println(end);