广告位联系
返回顶部
分享到

C++项目实战之makefile使用

C语言 来源:互联网 作者:佚名 发布时间:2024-05-01 21:55:49 人浏览
摘要

makefile简介 一个工程中的源文件不计其数(一个项目有有很多的文件),现在的项目基本都是按模块进行划分的,而这些模块存放在若干目录中。 makefile中定义了一系列的规则(这些规则定义了一

makefile简介

一个工程中的源文件不计其数(一个项目有有很多的文件),现在的项目基本都是按模块进行划分的,而这些模块存放在若干目录中。

makefile中定义了一系列的规则(这些规则定义了一系列如何编译程序的操作,比如哪些文件需要编译、哪些临时文件需要及时的清除等),如此以来我们只需要通过make命令就可以一键编译源程序了。

所以常常说makefile带来的最大的好处就是"自动化编译",因为只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发效率。(以上用于可能不规范,是作者的理解)

make简介

make是一个命令工具,它能够解释Makefile文件中的指令,一般来说大多数IDE都具备这样的功能。

makefile的编写的规则

makefile文件的命名:

makefile 或者 Makefile

makefile的规则:

三要素:目标   依赖    命令

格式==》

  • 目标:依赖
  • (TAB)命令

目标:最终要生成的文件(伪目标除外) 

依赖:生成目标所需要的文件或目标(这里的目标是子目标)

命令:通过执行命令来操作依赖来生成目标

我们来看一个例子

当前文件夹有如下5个文件

第一个版本的Makefile 

第二个版本我们添加以下子目标

添加子目标的目的:

  • make工作原理1

命令在执行前,需要先检查规则中的依赖是否存在

  • 如果存在,则执行命令
  • 如果不存在,则向下搜索,检查有没有一个规则的目标是这个依赖,
  • 如果存在则先执行这个子目标,先生成这个最终目标所需的依赖,
  • 那么我们有了依赖才可以生成最终目标

1

2

3

collect2: error: ld returned 1 exit status  

 

//为毛会出现这个问题,好像是子啊制作动态库的时候才会用这个问题

第三个版本我们通过自定义变量的方式

第四个版本我们通过makfile中的自动变量

第五个版本使用函数

makefile中主要使用的只要两个函数

wildcard  ==》查找指定目录下的指定文件  

1

src=$(wildcard ./*.c)

patsubst  ==》将指定目录下的什么文件后缀进行替换

1

obj=$(pastsubst ./%.c,./%.o,$(src))

第6个版本 加上仿函数

加上仿函数的目的:

对于makefile而言下面的规则全都是最终的目标提供服务的。

如果不是最终规则(第一个规则)所需要的依赖那么不会区执行。

但是通过伪目标就可以打破这个约定,一定会执行


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • c++项目中后缀名vcxproj和sln的区别及说明
    c++项目后缀名vcxproj和sln区别 `.vcxproj 文件 是 Visual Studio 中用于存储 C++ 项目配置和设置的 XML 文件。 它包含了项目的编译选项、链接选项、
  • C++项目实战之makefile使用

    C++项目实战之makefile使用
    makefile简介 一个工程中的源文件不计其数(一个项目有有很多的文件),现在的项目基本都是按模块进行划分的,而这些模块存放在若干目录中
  • c++的构造函数使用方式介绍
    1.什么是构造函数? C++中的构造函数是一种特殊的成员函数,用于在创建对象时进行初始化操作。 构造函数的名称与类名相同,没有返回类
  • Java集合中获取数据前驱和后继元素的实现
    使用场景 使用一致性hash时,如何找到一个hash值对应的临近节点,可以使用集合中获取数据的前驱和后继元素实现。 1. NavigableSet 和 Navigab
  • C++中sln,vcxproj,vcxproj.filters,lib,dll,exe的含义说明
    sln,vcxproj,vcxproj.filters,lib,dll,exe含义 建立工程 建立C++工程后会生成多个文件 例如 sln,sdf,vcxproj,vcxproj.filters,vcxproj.user这些都是文件的扩展名。
  • Qt6子窗口全屏显示的实现

    Qt6子窗口全屏显示的实现
    一、全屏显示效果 二、全屏相关函数 1,全屏显示函数 1 QWidget::showFullScreen(); // 此方法只对顶级窗口有效,对子窗口无效 2,恢复显示函数
  • Qt获取git版本信息的具体方法

    Qt获取git版本信息的具体方法
    今天又碰到这个问题了,想根据具体的git版本信息做代码问题确认。之前写过类似的文章,不是用的Makedown,今天规整一下。 2、具体方法
  • C#串行通信serialPort的使用
    System.IO.Ports.SerialPort类是C#中用于串行通信的类。它提供了一组属性和方法,用于配置串行端口、读取和写入数据,以及处理串行通信中的事
  • C++中IO多路复用(select、poll、epoll)的实现介绍

    C++中IO多路复用(select、poll、epoll)的实现介绍
    什么是IO多路复用 I/O多路复用(IO multiplexing)是一种并发处理多个I/O操作的机制。它允许一个进程或线程同时监听多个文件描述符(如套接
  • C++文件IO流及stringstream流读写文件和字符串操作介

    C++文件IO流及stringstream流读写文件和字符串操作介
    一、引入 1 2 3 4 5 6 7 8 9 int main() { string str; while (cin str) { cout str endl; } return 0; } 我们在OJ的时候经常会用到while(cin str),这里的流提取实际上是
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计