Makefile文件编译c++源码入门教程

Makefile相关依赖

MinGW

MinGW(Minimalist GNU for Windows)是一个用于Windows系统的开源软件开发工具集,它允许你在Windows平台上使用GNU工具集来编译、链接和运行原生Windows程序。MinGW提供了GCC(GNU Compiler Collection)编译器以及其他常用的GNU工具,如链接器、调试器等,使得开发者能够在Windows上编写和运行使用CC++等语言编写的程序。

MinGW的主要特点包括:

  • 跨平台兼容性MinGW允许开发者在Windows上编写和编译与GNU/Linux平台兼容的程序,从而更容易实现跨平台开发。
  • 开源和免费MinGW是一个开源项目,其源代码可以自由获取和修改。同时,它也是一个免费工具集,用户可以无需支付任何费用即可使用。
  • 集成度高MinGW集成了GCC编译器、链接器、调试器等一系列开发工具,使得开发者可以在一个统一的环境中完成程序的开发、编译和调试。
  • 易于使用MinGW的安装和配置相对简单,开发者可以快速地将其集成到他们的开发环境中。

windows11安装教程

Windows11配置MinGW

Makefile文件

Make工具编译源文件时,需要编写Makefile文件。Makefile 是用于自动化编译和构建项目的文件,特别是在 CC++ 等编译型语言中。它包含了一系列的规则,这些规则定义了如何从源代码文件生成可执行文件或库文件,以及这些文件之间的依赖关系。

  1. Makefile 通常包含以下几个部分:
命名解释
变量定义用于存储编译选项、源文件列表等
目标定义描述要构建的目标(如可执行文件)及其依赖关系
规则定义如何从源文件生成目标文件,以及如何编译这些源文件
  1. 规则如下:
目标target...:依赖dependencies...命令command1命令command2...
命名解释
target是规则生成的目标,可以是可执行文件或库文件等
dependencies是target生成所依赖的文件或其他目标
command是需要执行的命令,需要用TAB键来缩进

编写源文件

  1. main.cpp文件
#include <iostream>
#include "hello.hpp"int main(){std::cout << "this is c++ main function!" << std::endl;hello();return 0;
}
  1. hello.cpp文件
    源文件:
#include <iostream>
#include "hello.hpp"int hello(){std::cout << "i love c++" << std::endl;return 0;
}

hello.hpp头文件:

int hello();

gcc编译(c++用g++编译)源文件

  1. 查看当前目录下文件:ls
D:\work\make> ls目录: D:\work\makeMode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         2024/3/17     11:59          45054 a.exe
-a----         2024/3/17     11:34            122 hello.cpp
-a----         2024/3/17     11:27             12 hello.hpp
-a----         2024/3/17     11:33            159 main.cpp
  1. 编译生成中间件.o对象文件:g++ -c hello.cpp main.cpp
D:\work\make> g++ -c hello.cpp main.cpp
D:\work\make> ls目录: D:\work\makeMode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         2024/3/17     11:34            122 hello.cpp
-a----         2024/3/17     11:27             12 hello.hpp
-a----         2024/3/17     12:00           1720 hello.o
-a----         2024/3/17     11:33            159 main.cpp
-a----         2024/3/17     12:00           1827 main.o
  1. 生成目标可执行文件:g++ main.o hello.o -o main

D:\work\make> g++ main.o hello.o -o main
D:\work\make> ls目录: D:\work\makeMode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         2024/3/17     11:34            122 hello.cpp
-a----         2024/3/17     11:27             12 hello.hpp
-a----         2024/3/17     12:00           1720 hello.o
-a----         2024/3/17     11:33            159 main.cpp
-a----         2024/3/17     12:01          45054 main.exe
-a----         2024/3/17     12:00           1827 main.o
  1. 运行可执行文件:./main.exe

D:\work\make> ./main.exe
this is c++ main function!
i love c++

编写Makefile文件

  1. 事先已经安装好MinGW,在C:\MinGW\bin中会有mingw-make.exe文件,可以拷贝个副本,改名make.exe,方便操作。测试make -v,输出如下:
C:\Users\yance>make -v
GNU Make 3.82.90
Built for i686-pc-mingw32
Copyright (C) 1988-2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

编写简单的Makefile文件

  1. Makefile文件内容:
# version 1
main: main.o hello.og++ main.o hello.o -o mainmain.o: main.cpp hello.hppg++ -c main.cpp -o main.ohello.o: hello.cpp hello.hppg++ -c hello.cpp -o hello.o# 在windows中 rm 命令报错,无法在PS里使用,只能用在cmd中,所用用del
clean:del *.o main  
  1. Makefile文件目录下利用PS输入命令make

D:\work\make> ls目录: D:\work\makeMode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         2024/3/17     15:45            122 hello.cpp
-a----         2024/3/17     11:27             12 hello.hpp
-a----         2024/3/17     11:33            159 main.cpp
-a----         2024/3/17     16:23            301 MakefileD:\work\make> make
g++ -c main.cpp -o main.o
g++ -c hello.cpp -o hello.o
g++ main.o hello.o -o main
  1. 最终的生成文件:增加了两个.o文件,一个.exe文件
D:\work\make> ls目录: D:\work\makeMode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         2024/3/17     15:45            122 hello.cpp
-a----         2024/3/17     11:27             12 hello.hpp
-a----         2024/3/17     16:25           1720 hello.o
-a----         2024/3/17     11:33            159 main.cpp
-a----         2024/3/17     16:25          45054 main.exe
-a----         2024/3/17     16:25           1827 main.o
-a----         2024/3/17     16:23            301 Makefile
  1. 删除中间文件,输入命令make clean,可以看到.o文件都被删除了。
D:\work\make> make clean
del *.o main
D:\work\make> ls目录: D:\work\makeMode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         2024/3/17     15:45            122 hello.cpp
-a----         2024/3/17     11:27             12 hello.hpp
-a----         2024/3/17     11:33            159 main.cpp
-a----         2024/3/17     16:25          45054 main.exe
-a----         2024/3/17     16:23            301 Makefile
  1. 运行可执行文件:./main.exe

D:\work\make> ./main.exe
this is c++ main function!
i love c++

  1. 可以看到,编辑Makefile文件就是重复利用Linux命令gcc相关的编译命令,但可以看到这版本的Makefile鲁棒性和冗余性很差。

升级版编写Makefile文件

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

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

相关文章

Android 调试打印对应的调用堆栈

在平时的开发调试的时候&#xff0c;经常碰到需要打印JAVA、Native C、kernel的代码调用关系。这里做一下记录 Jave堆栈打印 使用android.util.Log类进行打印 /*** Send a {link #DEBUG} log message and log the exception.* param tag Used to identify the source of a lo…

AJAX学习(四)

版权声明 本文章来源于B站上的某马课程&#xff0c;由本人整理&#xff0c;仅供学习交流使用。如涉及侵权问题&#xff0c;请立即与本人联系&#xff0c;本人将积极配合删除相关内容。感谢理解和支持&#xff0c;本人致力于维护原创作品的权益&#xff0c;共同营造一个尊重知识…

聊聊Python都能做些什么

文章目录 一、Python简介二、Python都能做些什么1. Web开发2. 数据分析和人工智能3. 自动化运维和测试4. 网络爬虫5. 金融科技 三、Python开源库都有哪些1. Web开发2. 数据分析和科学计算3. 机器学习和深度学习4. 网络爬虫5. 自动化和测试6. 其他常用库 四、相关链接 一、Pytho…

C++内存分布与动态内存管理

文章目录 :dizzy: C/C内存分布:dizzy:C语言中动态内存管理方式  :sparkles:malloc   :sparkles:calloc  :sparkles:reallocfree :dizzy:C语言中动态内存管理方式  :sparkles:new和delete操作内置类型  :sparkles:new和delete操作自定义类型 :dizzy:operator new与ope…

C语言自学笔记13----C语言指针与函数

C 语言指针与函数 在C语言编程中&#xff0c;也可以将地址作为参数传递给函数。 要在函数定义中接受这些地址&#xff0c;我们可以使用指针。这是因为指针用于存储地址。让我们举个实例&#xff1a; 示例&#xff1a;通过引用致电 #include <stdio.h> void swap(int n1, …

数星星 刷题笔记 (树状数组)

依题意 要求每个点 x, y 的左下方有多少个星星 又因为 是按照y从小到大 给出的 所以 我们在计算个数的时候是按照y一层层变大来遍历的 因此我们在处理每一个点的时候 只需要看一下 当前的点有多少个点的x值比当前点小即可 树状数组的 操作模板 P3374 【模板】树…

rsa数据加密无大小限制——golang实现

由于rsa加密需要公钥长度大于消息长度&#xff0c;消息太长时经常会报错Message too long for RSA 采用分块的方法&#xff0c;将消息分成更小的块&#xff0c;解决这个问题 package xrsa import ("encoding/pem""encoding/base64""crypto/x509"…

动态规划题目集一(代码 注解)

目录 介绍&#xff1a; 题目一: 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 题目七&#xff1a; 题目八&#xff1a; 题目九&#xff1a; 介绍&#xff1a; 动态规划是一种算法设计技术&#xff0c;用于解决具有重叠…

水泵房远程监控物联网系统

随着物联网技术的快速发展&#xff0c;越来越多的行业开始利用物联网技术实现设备的远程监控与管理。水泵房作为城市供水系统的重要组成部分&#xff0c;其运行状态的监控与管理至关重要。HiWoo Cloud作为专业的物联网云服务平台&#xff0c;为水泵房远程监控提供了高效、稳定、…

音乐播放器-C#实现

音乐播放器-C#实现 目录 一、 代码介绍 二、 音乐播放器-C#实现 三、 音乐播放器-C#实现 四、 音乐播放器-C#实现 五、 音乐播放器-C#实现 代码介绍 代码中使用了.NET框架中的System.Media命名空间来处理音频文件的播放和控制。这段代码创建了一个简单的音乐播放器界…

Java访问数据库(重点:SpringBoot整合Mybatis)

目录 一、通过JDBC访问数据库1、思路2、示例3、思考 二、通过ORM框架访问数据库&#xff08;主要是Mybatis&#xff09;1、示例1.1 配置1.2 SQL写在xxxMapper.xml中&#xff1a;mapper/UserMapper.xml1.3 xxxMapper.xml对应的xxxMapper接口&#xff08;Application通过该接口访…

C#设计原则

学习设计原则是学习设计模式的基础。在实际的开发过程中&#xff0c;并不是一定要求所有的代码都遵循设计原则&#xff0c;而是要综合考虑人力、成本、时间、质量&#xff0c;不刻意追求完美&#xff0c;要在适当的场景遵循设计原则。 这体现的是一种平衡取舍&#xff0c;可以…

SRE运维揭秘: 企业生产中运维监控的真相

大家好&#xff0c;我是博哥爱运维&#xff0c;有着十年SRE运维开发经验&#xff0c;从事过全球多个主流云平台的服务架构设计及自动化运维开发工作&#xff0c;在企业中基于gitlab和k8s从零设计过完整的一套CICD流水线架构&#xff0c;曾用shell开发过运维堡垒机系统&#xff…

磁盘未格式化,数据恢复有妙招

一、初遇磁盘未格式化&#xff0c;惊慌失措 在日常生活和工作中&#xff0c;我们经常会使用各种存储设备来保存重要的文件和数据。然而&#xff0c;有时当我们尝试访问这些存储设备时&#xff0c;却会突然遇到一个令人头痛的问题——磁盘未格式化。这个突如其来的提示让我们措…

虚拟函数和普通函数的区别?内联函数和构造函数能否成为虚拟函数?

虚拟函数和普通函数的区别主要在于它们的调用方式。当一个类中有虚拟函数时&#xff0c;编译器会为该类创建一个虚函数表&#xff08;vtable&#xff09;&#xff0c;这个表中存储了该类中所有虚拟函数的地址。在运行时&#xff0c;通过基类的指针或引用调用派生类中的函数时&a…

[Python初阶]2255.统计是给定字符串前缀的字符串数目

目录 2255.统计是给定字符串前缀的字符串数目 ①.题目 ②.问题分析 ③.startswith()方法理解 与 说明 Ⅰ.定义和用法 Ⅱ.语法 ④.问题解决 ⑤总结 2255.统计是给定字符串前缀的字符串数目 ①.题目 ②.问题分析 需求:统计列表words中,是字符串s的前缀的字符串的数目. 解…

【解惑】离线版本的软件如何实现“授权验证”和“使用有效期”验证的

如何实现 要实现软件授权验证和使用有效期验证的离线版本&#xff0c;可以考虑以下几个步骤&#xff1a; 授权验证&#xff1a; 在软件的离线版本中&#xff0c;可以通过在软件中嵌入一个授权验证模块来进行验证。授权验证模块可以包含一个加密算法&#xff0c;用于生成和验证…

接口与多态

通过接口实现多态 接口中声明若干个 bstract方法&#xff1b; 方法体的内容细节由实现接口的类去完成&#xff0c;不同的类有 不同的实现方式 → 则接口变量在回调接口方法时具有多 种形态。 用接口进行程序设计的核心思想 使用接口回调技术&#xff1a;接口变量存放实现该接口…

(学习日记)2024.03.13:UCOSIII第十五节:基于时基列表的时延操作(持续更新)

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

Redis集群原理解析

一、单机Redis存在的问题 问题1&#xff1a;数据丢失问 解决方案&#xff1a;利用RDB和AOF实现数据的持久化 问题2&#xff1a;并发能力弱 解决方案&#xff1a;搭建主从集群&#xff0c;实现主从分离 问题3&#xff1a;存储空间小 解决方案&#xff1a;搭建分片集群&#xff0…