当前位置: 首页 > news >正文

C++ PrimerPlus 复习 第一章 命令编译链接文件 make文件

第一章 命令编译链接文件

  • C++ 有什么呢?
  • C++ 源代码文件后缀
  • 运行C++过程
  • 可执行代码:
  • 编译语法:
  • make
    • Makefile 基础语法
    • 编写完make只要和将要编译的文件放一起就行 然后在该目录使用make命令,就将自动运行;
    • 基础的Makefile版本 现在的缺点也大 \^-\^
    • 更加健全的Makefile 但还是有不小的缺点
    • 常用版本

C++ 有什么呢?

面向对象编程:
主要就是将功能封装
泛型编程:
各种各样的模板

C++ 源代码文件后缀

在这里插入图片描述

运行C++过程

源代码 --> 编译器 --> 目标代码 --> 链接程序 -->可执行代码;
在这里插入图片描述

可执行代码:

就是一大堆指令的集合
.exe 和 .out 文件都是可执行文件的扩展名,但它们通常与不同的操作系统和编程环境相关联。
以下是它们的一些主要区别:
.exe 文件:
Windows系统中常见的可执行文件扩展名。
通常用于Windows上的可执行文件,如C++或C#程序。
.exe 文件包含了Windows操作系统所需的可执行代码和元数据。
.out 文件:
.out 文件通常在类Unix和类Linux操作系统中见到,如Linux和macOS。
这是一种通用的可执行文件扩展名,用于包含在Unix/Linux环境下的各种编程语言(如C/C++、Python等)编译后生成的可执行文件。
.out 文件不包含特定于操作系统的元数据,因为它们通常在Unix/Linux环境中运行,这些系统不需要额外的元数据来识别可执行文件。
需要注意的是,这些扩展名并不是绝对的,它们只是一种约定,你可以根据需要为可执行文件选择不同的扩展名。在Linux或macOS中,你可以通过使用chmod命令将文件设置为可执行,而不需要特定的扩展名。只要文件具有可执行权限,你就可以在终端中运行它。
总的来说,.exe 文件通常与Windows相关,而.out 文件通常与Unix和Linux相关,但这只是一种通用的命名约定,不是绝对规则。

编译语法:

编译器自动将目标代码文件(.o)传递给系统链接程序,该程序将代码与库代码结合起来,生成一个可执行文件。
在默认情况下,可执行文件为a.out ,win是exe
如果只使用一个源文件,链接程序还将删除spiffy.o文件,因为这个文件不再需要了。
要运行该程序,只要输入可执行文件的文件名即可
直接没有 error.o 文件

-c 选项来告诉编译器只生成目标文件,而不生成可执行文件
没有-c
g++ error5.cpp -o error5.exe
在这里插入图片描述

g++ -c .\sumafile_6_16.cpp 生成目标文件 sumafile_6_16.o

g++ -o sumafile.exe .\sumafile_6_16.o 生成可执行文件 sumafile.exe

多个源文件
在这里插入图片描述
单个无法,运行这个,生成main.exe文件运行

g++ -o filename.exe studentc.o use_stuc.o
前面可以直接填filename不加exe,可以直接生成filename.exe文件

在这里插入图片描述

make

在这里插入图片描述
上面是我将要编译链接的文件
如果我进行常规处理

g++ -c  studentc.cpp -o studentc.o
g++ -c  use_stuc.cpp -o use_stuc.o
g++ -o student studentc.o use_stuc.o

现在看起来还好是吧,但文件一多就是痛苦,所以引用make命令

Makefile 基础语法

语法:
[目标]: [依赖]
(tab制表符)[命令]

普通版本 缺点大

main.exe: file1.cpp file2.cppg++  file1.cpp file2.cpp -o main.exe

编写完make只要和将要编译的文件放一起就行
然后在该目录使用make命令,就将自动运行;

基础的Makefile版本 现在的缺点也大 ^-^

$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表

CXX = g++
TARGET = hello.exe
OBJ = file1.o file2.oCXXFLAGS = -c -Wall$(TARGET): $(OBJ)$(CXX) $^ -o $@%.o: %.cpp$(CXX) $(CXXFLAGS) $< -o $@.PHONY: clean
clean:del /Q *.o hello.exe

更加健全的Makefile 但还是有不小的缺点

# CXX = g++
# TARGET = hello.exe
# OBJ = file1.o file2.o# CXXFLAGS = -c -Wall# $(TARGET): $(OBJ)
# 	$(CXX) $^ -o $@# %.o: %.cpp
# 	$(CXX) $(CXXFLAGS) $< -o $@# .PHONY: clean
# clean:
# 	del /Q *.o hello.exe

常用版本

在这里插入图片描述

CXX = g++
TARGET = main
SRC = $(wildcard *.cpp)
OBJ = $(patsubst %.cpp, %.o, $(SRC))CXXFLAGS = -c -Wall# all: $(TARGET) clean$(TARGET): $(OBJ)$(CXX) -o $@ $^make clean%.o: %.cpp$(CXX) $(CXXFLAGS) $< -o $@.PHONY: clean
clean:del /Q *.o
http://www.lryc.cn/news/167404.html

相关文章:

  • 微信小程序——常用组件的属性介绍
  • 【深度学习】 Python 和 NumPy 系列教程(廿七):Matplotlib详解:3、多子图和布局:散点矩阵图(Scatter Matrix Plot)
  • 解决jupyter打开的默认路径问题
  • Git 学习笔记
  • 【Qt】QGroundControl入门3:源码初探
  • 腾讯mini项目-【指标监控服务重构】2023-07-31
  • Rust通用编程概念(3)
  • 学Python的漫画漫步进阶 -- 第四步
  • 【LeetCode-中等题】18. 四数之和
  • 每日一题 102二叉树的层序遍历
  • 牛客: BM4 合并两个排序的链表
  • C语言基础知识点(六)二维数组指针和地址
  • nodejs格式化输入
  • 国家网络安全周 | 金融日,一起 get金融行业数据安全
  • 分布式事务解决方案之TCC
  • Git 的基础命令 码云 gitee
  • 探索工业4.0:数字孪生如何重塑工业生产流程?
  • window server事件ID说明
  • router-link 和 router-view的区别
  • 【Leetcode】139.单词拆分
  • PMP考试一定要报培训班吗?
  • dart 学习 之 Getters and setters
  • 使用融云 CallPlus SDK,一小时实现一款 1V1 视频应用
  • Redis Part1
  • 代理HTTP使用不当会出现哪些问题?如何正确使用代理服务?
  • 利用芯片74hc165为单片机增加输入扩展端口proteus仿真arduino
  • docker真实IP解决
  • Linux 内存泄漏检测的基本原理
  • Ubuntu下Nginx配置ModSecurity详细思路及过程
  • 入职美团近三个月,闲聊几句