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


    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
    
    • 1
    • 2
    • 3

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

    Makefile 基础语法

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

    普通版本 缺点大

    main.exe: file1.cpp file2.cpp
    	g++  file1.cpp file2.cpp -o main.exe
    
    • 1
    • 2

    编写完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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    更加健全的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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    常用版本

    在这里插入图片描述

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    面试了20+前端大厂,整理出的面试题
    UE4 创建暂停和结束游戏UI
    Python-数据爬取(爬虫)
    Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 电子招标采购系统功能清单
    Practical Memory Leak Detection using Guarded Value-Flow Analysis 论文阅读
    安踏携手华为运动健康共同验证冠军跑鞋 创新引领中国体育
    红队隧道应用篇之Netsh端口转发
    RTC-实时音视频通信技术介绍与应用
    mysql巧妙化解递归查询树形数据 | 纯sql
    Java Web 实战 20 - HTTP PK HTTPS ? HTTPS 大获全胜 ?
  • 原文地址:https://blog.csdn.net/L2489754250/article/details/132818476