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

2023-09-11 23:51:48

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.cpp
	g++  file1.cpp file2.cpp -o main.exe

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

基础的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

更加健全的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
更多推荐

探索GmSSL+Nginx实践及原理

前言随着大国崛起步伐的迈进,敏感单位的数据安全问题越发受到重视,数据的加密安全传输尤为重要,对于安全问题,国家自研加密算法提供了有力的保障。作为信创行业的国有企业,十分有必要在网络通信中使用国密算法加密通信,保障客户数据安全,做出客户放心满意的产品。本文将介绍如何制作出支持国密算法的nginx,及相关原理。GmSSL介

Java线程池详解

好处降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。线程池一般用于执行多个不相关联的耗时任务,

Linux底层基础知识

一.汇编,C语言,C++,JAVA之间的关系汇编,C语言,C++可以通过不同的编译器,编译成机器码。而java只能由Java虚拟机识别。Java虚拟机可以看成一个操作系统,Java虚拟机是由汇编,C,Linux等编写而成的一个操作系统(面向os)不同的芯片,底层的CISC指令集不同,所以其机器码有区别,因此汇编不能跨平

用了 TCP 协议,就一定不会丢包吗?

表面上我是个技术博主。但没想到今天成了个情感博主。我是没想到有一天,我会通过技术知识,来挽救粉丝即将破碎的感情。掏心窝子的说。这件事情多少是沾点功德无量了。事情是这样的。最近就有个读者加了我的绿皮聊天软件,女生,头像挺好看的,就在我以为她要我拉她进群发成人专升本广告的时候。画风突然不对劲。她说她男朋友也是个程序员,异地

Docker 安装

Docker官网:Docker:AcceleratedContainerApplicationDevelopmentDockerHub官网:https://hub.docker.com/前提说明CentOSDocker安装前提条件目前,CentOS仅发行版本中的内核支持Docker。Docker运行在CentOS7(6

蒙特卡洛树搜索(MCTS)在Python中实现井字游戏策略优化详细教程

1.介绍井字游戏(TicTacToe)是大家都很熟悉的一款策略游戏,两个玩家轮流在3x3的棋盘上放置自己的标记(通常是’X’和’O’),目标是在任意方向上(横、竖、斜)连续三个自己的标记。而蒙特卡洛树搜索(MCTS)则是一种广泛用于复杂策略游戏(例如围棋、象棋等)的算法。在本文中,我们将结合这两者,使用MCTS为井字游

iOS系统下轻松构建自动化数据收集流程

目录python的优势ShortcutsApp介绍如何结合Python与ShortcutAppiOS系统下轻松构建自动化数据收集流程总结在当今的数字化时代,数据已经成为企业成功的关键因素之一。然而,随着业务的发展和数据量的增加,手动收集和分析数据的方式已经不再可行。在iOS系统下,我们可以利用一些工具和技术来轻松构建自

Guava精讲(三)-Caches,同步DB数据到缓存

在开发中,我们经常需要从数据库中读取数据并进行频繁的读取操作。缓存在各种场景中都有运用,例如,当一个值的计算或检索成本很高,而且在某个输入中需要多次使用该值时,就应该考虑使用缓存,因此将数据缓存在内存中可以显著提高应用程序的性能。问题描述假设我们正在开发一个电子商务网站,需要频繁地显示商品信息。商品信息存储在数据库中,

SpringMVC之JSON返回&异常处理机制

json处理统一异常处理1.json处理//pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-in

服务器搭建(TCP套接字)-select版(服务端)

一、select头文件#include<sys/select.h>二、select原型intselect(intnfds,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout);select()是一个系统调用函数,用于在多个文件描述符

K8S架构原理

目录一、k8s概述1、什么是k8s?2、特性3、主要功能二、集群架构与组件1.Master组件(1)Kube-apiserver(2)Kube-controller-manager(3)Kube-scheduler调度算法:2.配置存储中心3.Node组件(1)Kubelet(2)Kube-Proxy(3)docker

热文推荐