Bootstrap

开发者如何使用GCC提升开发效率Cmake操作

阅读此文前请先查看
开发者如何使用GCC提升开发效率libusb操作
开发者如何使用GCC提升开发效率IMG操作

读前思考

阅读此篇前我们先了解下为什么要使用Cmake

CMakeLists.txt 是 CMake 的配置文件,它用于定义项目的构建设置和规则。CMake 是一个跨平台的开源构建系统工具,广泛用于 C++ 项目的构建管理。CMakeLists.txt 的意义主要体现在以下几个方面:

  1. 项目配置:它指定了项目的名称、版本及其所需的最小 CMake 版本。这一部分为项目的构建提供了基础。
  2. 定义构建目标:可以在文件中定义可执行文件、库文件等构建目标,包括源文件、头文件的目录和文件名。
  3. 依赖管理:CMakeLists.txt 支持设置目标之间的依赖关系,使得构建顺序能够自动处理。
  4. 跨平台支持:通过 CMake,可以轻松地在不同的平台(如 Windows、Linux、macOS)上生成适合该平台的构建文件。
  5. 优化构建配置:可以配置编译选项、链接库、定义宏等,帮助优化项目的构建过程。
  6. 生成 IDE 项目:CMake 可以生成各种集成开发环境(如 Visual Studio、Xcode)的项目文件,方便开发者使用。
    通常,CMakeLists.txt 文件是 CMake 项目的核心部分,通过合理配置,可以大大简化项目的构建流程
    `
先上效果图

Cmake编译先前的IMG操作代码,编译速度有所提升。
在这里插入图片描述

在这里插入图片描述

Vscode安装插件

在这里插入图片描述

Ctrl +Shift + P
命令行工具
在这里插入图片描述

Quick Start

https://github.com/microsoft/vscode-cmake-tools/blob/main/docs/how-to.md#build-a-project

按照流程撸下来

在这里插入图片描述
在这里插入图片描述

生成目录结构

其中最关键的main.cpp CMakeList.txt, CmakePersets.json都生成了说明你配置成功了
在这里插入图片描述

CMakePresets.json

自动生成,不用关心,注意CMAKE_CXX_COMPILER编译器的位置是否正确
在这里插入图片描述

CMakeLists.txt

内容非常简单,注释已经加上自己看

# Specifies the minimum required CMake version (3.5.0).
cmake_minimum_required(VERSION 3.5.0)
# Defines a project named cmake_test with version 0.1.0, supporting both C and C++ languages.
project(cmake_test VERSION 0.1.0 LANGUAGES C CXX)
# Includes header files from the include directory in the project's source directory.
include_directories(${PROJECT_SOURCE_DIR}/include)
# Recursively finds all .cpp files in the src directory and stores them in the SRCS variable.
file(GLOB_RECURSE SRCS "src/*.cpp")
# Prints the project's source directory to the console.
message(STATUS "PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
# Compiles the found source files into an executable named cmake_test.
add_executable(cmake_test ${SRCS})

源代码
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"
#include "image_loader.h"
#include "image_processor.h"
#include <iostream>

int main()
{
    const char *inputFilepath = "G:/WorkSpacePy/cmake_test/AppDiagram.png";
    // 输入图像路径
    const char *outputFilepath = "G:/WorkSpacePy/cmake_test/output_image.png";
    // 输出图像路径

    int width, height, channels;

    // 加载图像
    unsigned char *img_data = ImageLoader::loadImage(inputFilepath, width, height, channels);
    if (img_data == nullptr)
    {
        return -1; // 加载失败
    }

    // 打印图像信息
    std::cout << "Image loaded successfully!" << std::endl;
    std::cout << "Width: " << width << ", Height: " << height << ", Channels: " << channels << std::endl;

    // 反转颜色
    ImageProcessor::invertColors(img_data, width, height, channels);
 
    std::cout  << "outputFilepath: " << outputFilepath << std::endl;

    // 保存新的图像
    if (stbi_write_png(outputFilepath, width, height, channels, img_data, width * channels))
    {
        std::cout << "Image saved successfully as " << outputFilepath << std::endl;
    }
    else
    {
        std::cerr << "Error saving image!" << std::endl;
    }

    // 释放图像数据
    ImageLoader::freeImage(img_data);

    // https://www.sfml-dev.org/download/sfml/2.6.2/
    return 0;
}
个人感受

相较于MinGw64可以直观看到编译指令,有助于加深理解,Cmake一方面方便开发集成,另一方面却造成了学习断代,这也是为什么一些上层开发者往底层学习时往往感觉遇到了一堵高墙的感觉,是因为被封装保护的太好了
Starting build... G:\mingw64\bin\g++.exe G:\WorkSpacePy\images_gui/src/*.cpp -IG:\WorkSpacePy\images_gui/stb -IG:\libusb-MinGW-x64\include -LG:\libusb-MinGW-x64\lib -IG:\SFML-2.6.2\include -LG:\SFML-2.6.2\lib -o G:\WorkSpacePy\images_gui\src/main.exe -lsfml-graphics -lsfml-system -lsfml-window -lusb-1.0

;