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

【小沐学C++】C++ 基于Premake构建工程项目(Windows)

文章目录

  • 1、简介
  • 2、下载和安装
    • 2.1 下载
    • 2.3 快速入门
  • 3、使用
    • 3.1 支持的工程文件Project Files
    • 3.2 构建设置Build Settings
    • 3.3 链接Linking
    • 3.4 配置Configurations
    • 3.5 平台Platforms
    • 3.6 过滤Filters
    • 3.7 预设值Tokens
  • 4、测试
    • 4.1 测试1:入门例子
    • 4.2 测试2:入门例子2
    • 4.3 测试3:glfw例子
      • 4.3.1 准备第三方库glfw
      • 4.3.2 新建封装库项目ExampleDll
      • 4.3.3 新建测试项目ExampleTest
      • 4.3.4 新建构建脚本
      • 4.3.5 执行构建命令
  • 结语

1、简介

Premake是一个命令行实用程序,它读取软件项目的脚本定义,最常见的是使用它为Visual Studio,Xcode或GNU Make等工具集生成项目文件。

在这里插入图片描述

  • 官网地址:
    https://premake.github.io/

在这里插入图片描述

  • 什么是构建系统
    构建系统(BuildSystem)是用来从源码生成用户可以使用的目标(Targets)的自动化工具。目标可以包括库,可执行文件,或者生成的脚本等等。
    • 项目模块依赖关系维护 ;
    • 目标的可配置化(不同系统:Windows,Mac…;不同平台:Win32,Win64,Amd64…)
    • 目标生成的自动化

在这里插入图片描述

  • 常见的构建系统
    主流的可以跨平台,支持C++的构建系统
    • CMake
    • Scons
    • Premake
    • GNU Make
    • GNU autotools
    • Apache Ant(主要用于Java)
    • Gradle(主要用于Java)

在这里插入图片描述

  • Premake生成的目标工程
    Premake 5.0 的当前开发版本可以生成针对以下目标的 C、C++ 或 C# 项目:
    • Microsoft Visual Studio 2005-2019
    • GNU Make, including Cygwin and MinGW
    • Xcode
    • Codelite

在这里插入图片描述

2、下载和安装

2.1 下载

https://premake.github.io/download
在这里插入图片描述
这里我们下载编译好的sdk开发包,解压如下:
在这里插入图片描述

2.3 快速入门

  • 1、新建测试文件夹test
mkdir test
cd test
  • 2、新建构建脚本premake5.lua
    在这里插入图片描述
    premake5.lua的内容如下:
workspace "XiaomuWorkspace"configurations { "Debug", "Release" }project "XiaomuProject"kind "ConsoleApp"language "C++"files { "**.h", "**.cpp" }filter { "configurations:Debug" }defines { "DEBUG" }symbols "On"filter { "configurations:Release" }defines { "NDEBUG" }optimize "On"
  • 3、执行构建命令,生成指定工程
Premake5 vs2017

在这里插入图片描述
生成文件如下:
在这里插入图片描述

3、使用

3.1 支持的工程文件Project Files

ActionDescription
vs2022Generate Visual Studio 2022 project files
vs2019Generate Visual Studio 2019 project files
vs2017Generate Visual Studio 2017 project files
vs2015Generate Visual Studio 2015 project files
vs2013Generate Visual Studio 2013 project files
vs2012Generate Visual Studio 2012 project files
vs2010Generate Visual Studio 2010 project files
vs2008Generate Visual Studio 2008 project files
vs2005Generate Visual Studio 2005 project files
gmakeGenerate GNU Makefiles (This generator is deprecated by gmake2)
gmake2Generate GNU Makefiles (including Cygwin and MinGW)
xcode4XCode projects
codeliteCodeLite projects

若要生成 Visual Studio 2013 项目文件,请使用以下命令:

premake5 vs2013

3.2 构建设置Build Settings

设置名称设置标志
指定二进制类型(可执行文件、库)kind
指定源代码文件files, removefiles
定义编译器或预处理器符号defines
找到包含文件includedirs
设置预编译标头pchheader, pchsource
链接库、框架或其他项目links, libdirs
启用调试信息symbols
针对尺寸或速度进行优化optimize
添加任意构建标志buildoptions, linkoptions
设置已编译目标的名称或位置targetname, targetdir
defines { "DEBUG", "TRACE" }
defines { "CALLSPEC=__dllexport" }
includedirs { "../lua/include", "../zlib" }
includedirs { "../includes/**" }
pchheader "myproject.h"
optimize "Speed"
filter { "system:linux", "action:gmake" }buildoptions { "`wx-config --cxxflags`", "-ansi", "-pedantic" }
targetname "mytarget"

3.3 链接Linking

(1)链接到外部库是通过links 功能完成的。

links { "png", "zlib" }

(2)links 指令的位置在project 下面设置。

workspace "MyWorkspace"project "MyLibraryProject"-- ...project settings here...project "MyExecutableProject"-- ...project settings here...links { "MyLibraryProject" }

(3)而查找库,则使用如下指令。

libdirs { "libs", "../mylibs" }
# or
libdirs { os.findlib("X11") }

3.4 配置Configurations

配置是要应用于构建的设置集合,包括标志和开关、头文件和库搜索目录等。每个工作区定义自己的配置名称列表;大多数 IDE 提供的默认值是“调试”和“发布”。

workspace "MyWorkspace"configurations { "Debug", "Release" }
workspace "MyWorkspace"configurations { "Debug", "DebugDLL", "Release", "ReleaseDLL" }
workspace "MyWorkspace"configurations { "Froobniz", "Fozbat", "Cthulhu" }
workspace "HelloWorld"configurations { "Debug", "Release" }filter "configurations:Debug"defines { "DEBUG" }flags { "Symbols" }filter "configurations:Release"defines { "NDEBUG" }optimize "On"

3.5 平台Platforms

“平台”在这里有点用词不当;我再次遵循Visual Studio命名法。实际上,平台只是另一组构建配置名称,提供了另一个方向用于配置项目。

configurations { "Debug", "Release" }
platforms { "Win32", "Win64", "Xbox360" }
configurations { "Debug", "Release" }
platforms { "Win32", "Win64", "Xbox360" }filter { "platforms:Win32" }system "Windows"architecture "x86"filter { "platforms:Win64" }system "Windows"architecture "x86_64"filter { "platforms:Xbox360" }system "Xbox360"
configurations { "Debug", "Release" }
platforms { "Static", "DLL" }filter { "platforms:Static" }kind "StaticLib"filter { "platforms:DLL" }kind "SharedLib"defines { "DLL_EXPORTS" }

3.6 过滤Filters

project "MyProject"filter { "configurations:Debug" }targetdir "bin/debug"filter { "configurations:Release" }targetdir "bin/release"

3.7 预设值Tokens

wks.name
wks.location -- (location where the workspace/solution is written, not the premake-wks.lua file)prj.name
prj.location -- (location where the project is written, not the premake-prj.lua file)
prj.language
prj.groupcfg.longname
cfg.shortname
cfg.kind
cfg.architecture
cfg.platform
cfg.system
cfg.buildcfg
cfg.buildtarget -- (see [target], below)
cfg.linktarget -- (see [target], below)
cfg.objdirfile.path
file.abspath
file.relpath
file.directory
file.reldirectory
file.name
file.basename -- (file part without extension)
file.extension -- (including '.'; eg ".cpp")-- These values are available on build and link targets
-- Replace [target] with one of "cfg.buildtarget" or "cfg.linktarget"
--   Eg: %{cfg.buildtarget.abspath}
[target].abspath
[target].relpath
[target].directory
[target].name
[target].basename -- (file part without extension)
[target].extension -- (including '.'; eg ".cpp")
[target].bundlename
[target].bundlepath
[target].prefix
[target].suffix

4、测试

4.1 测试1:入门例子

  • 新建文件夹test001:
mkdir test001
cd test001
  • 新建代码文件hello.c:
/* hello.c */
#include <stdio.h>int main(void) {puts("Hello, world! 爱看书的小沐!");return 0;
}
  • 新建构建脚本文件premake5.lua:
-- premake5.lua
workspace "XiaoMuProject"configurations { "Debug", "Release" }project "XiaoMu001"kind "ConsoleApp"language "C"targetdir "bin/%{cfg.buildcfg}"files { "**.h", "**.c" }filter "configurations:Debug"defines { "DEBUG" }symbols "On"filter "configurations:Release"defines { "NDEBUG" }optimize "On"
  • 执行构建命令如下:
# premake5 --file=MyProjectScript.lua vs2013
premake5 vs2017

结果如下:
在这里插入图片描述
用vs2017打开上面生成的工程文件:
在这里插入图片描述
在这里插入图片描述

4.2 测试2:入门例子2

  • premake5.lua
workspace "XiaMuTest002" -- 解决方案startproject "Test" -- 开始项目configurations{"Debug","Release"}platforms{"Win32","Win64"}filter "platforms:Win32"system "Windows"architecture "x32"filter "platforms:Win64"system "Windows"architecture "x86_64"outputdir = "%{cfg.platform}/%{cfg.buildcfg}/%{prj.name}"
project "XiaMuTest002"kind "ConsoleApp"language "C++"files{"./**.cpp","*.c"}targetdir("../bin/" .. outputdir)objdir("../obj/" .. outputdir)

在这里插入图片描述

4.3 测试3:glfw例子

4.3.1 准备第三方库glfw

https://github.com/glfw/glfw/releases
在这里插入图片描述
下载完毕之后,解压到文件夹如下:
在这里插入图片描述
在这里插入图片描述

4.3.2 新建封装库项目ExampleDll

  • ExampleDll.h
#ifndef EXAMPLE_DLL_HPP
#define EXAMPLE_DLL_HPP 1#include <string>
#include <memory>
struct GLFWwindow;namespace ExDLL
{	class _declspec(dllexport) Window{public:Window(int width, int  height, const std::string& title);~Window();bool shouldClose() const noexcept;void pollEvents() const noexcept;void swapBuffers() const noexcept;std::pair<int, int> getWindowSize() const noexcept;	private:GLFWwindow* wnd;};
}
#endif
  • ExampleDll.cpp
#include "ExampleDll.h"
#include <GLFW/glfw3.h>namespace ExDLL
{Window::Window(int width, int height, const std::string& title){glfwInit();wnd = glfwCreateWindow(width, height, title.c_str(), nullptr, nullptr);glfwMakeContextCurrent(wnd);}Window::~Window(){glfwDestroyWindow(wnd);glfwTerminate();}bool Window::shouldClose() const noexcept{return glfwWindowShouldClose(wnd) != 0;}void Window::pollEvents() const noexcept{glfwPollEvents();}void Window::swapBuffers() const noexcept{glfwSwapBuffers(wnd);}std::pair<int, int> Window::getWindowSize() const noexcept{std::pair<int, int> sz{};glfwGetWindowSize(wnd, &sz.first, &sz.second);return sz;}
}

4.3.3 新建测试项目ExampleTest

  • main.cpp
#include <ExampleDll.h>#if defined _WIN32#include <Windows.h>#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
#endif
#include <gl/GL.h>//导入ExampleDll中的Window类
class _declspec(dllimport) ExDLL::Window;int main()
{ExDLL::Window window{ 1000, 600, "Hello World! 爱看书的小沐,2023" };while (!window.shouldClose()){// 事件更新window.pollEvents();// 绘图glBegin(GL_TRIANGLES);glColor3f(1.0, 0.0, 0.0);glVertex2f(-0.5f, -0.5f);glColor3f(1.0, 1.0, 0.0);glVertex2f(0.5f, -0.5f);glColor3f(1.0, 0.0, 1.0);glVertex2f(0, 0.5f);glEnd();// 渲染更新window.swapBuffers();}return 0;
}

4.3.4 新建构建脚本

  • premake5.lua
workspace "XiaoMuTest003"startproject "ExampleTest" -- 开始项目location "vs"language "C++"architecture "x64"configurations {"Debug","Release"}filter {"configurations:Debug"}symbols "On"filter {"configurations:Release"}optimize "On"-- 重置过滤器的其他设定filter {}targetdir ("build/target/%{prj.name}/%{cfg.longname}")objdir ("build/obj/%{prj.name}/%{cfg.longname}")postbuildcommands{("{COPY} %{cfg.buildtarget.relpath} \"../bin/\"")}-- 定义函数,包含glfw三方库头文件,可被其他工程调用
function includeGLFW()includedirs "../3rd/glfw-3.3.8.bin.WIN64/include"
end-- 定义函数,链接glfw三方库
function linkGLFW()libdirs "../3rd/glfw-3.3.8.bin.WIN64/lib-vc2017"links "glfw3dll"
end-- ExampleDll项目
project "ExampleDll"kind "SharedLib"files "src/ExampleDll/**"includeGLFW()linkGLFW()-- 定义函数,链接ExampleDll动态库
function useExampleDLL()includedirs "src/ExampleDll"links "ExampleDll"
end-- App应用程序
project "ExampleTest"kind "ConsoleApp"files "src/ExampleTest/**"useExampleDLL()filter "system:windows"links {"OpenGL32"}

4.3.5 执行构建命令

最后构建的文件夹和里面存放的文件组织如下:
在这里插入图片描述

premake5 vs2017

在这里插入图片描述
vs2017打开生成的工程文件如下:在这里插入图片描述
编译和运行后:

在这里插入图片描述

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

相关文章:

【小沐学C++】C++ 基于Premake构建工程项目(Windows)

文章目录 1、简介2、下载和安装2.1 下载2.3 快速入门 3、使用3.1 支持的工程文件Project Files3.2 构建设置Build Settings3.3 链接Linking3.4 配置Configurations3.5 平台Platforms3.6 过滤Filters3.7 预设值Tokens 4、测试4.1 测试1&#xff1a;入门例子4.2 测试2&#xff1a…...

Linux shell编程学习笔记2:我是谁 | who am i ?

〇、更新记录 20230926 补充例子2 一、前言 由于Linux系统的shell有许多种&#xff1a;sh、bash、cshell、tcsh、zsh……这些shell以sh为基础对象&#xff0c;在保持兼容性时又各有有创建&#xff0c;形成自己的功能特点&#xff0c;要想让我们编写的shell代码正确、可靠运行…...

移动端和PC端对比【组件库+调试vconsole +单位postcss-pxtorem+构建vite/webpack+可视化echarts/antv】

目录 组件库 移动端 vue vant PC端 react antd vue element 调试&#xff1a;vconsole vs dev tools中的控制台&#xff08;Console&#xff09; vconsole&#xff1a;在真机上调试 postcss-pxtorem&#xff1a;移动端不同的像素密度 构建工具 webpack 原理 Ba…...

maven多模块依赖包程序包xxx不存在

背景 rpc-common 被 rpc-server、rpc-client依赖 项目地址 https://github.com/pjmike/springboot-rpc-demo mvn clean install 打包时报错 报错信息 程序包xxxx不存在 找不到符号 原因分析 原因还不清楚&#xff0c;网友们帮解答一下 解决 主pom.xml 添加 <packaging…...

iOS17.0.2更新修复iPhone 15系列机型数据迁移问题,附新机快速数据迁移办法!

iPhone 15 系列机型已于今日正式发售&#xff0c;为解决iPhone15这些机型出现的数据迁移问题&#xff0c;苹果紧急发布了 iOS 17.0.2 更新&#xff0c;内部版本号为 21A350。 需要注意的是&#xff0c; iOS 17.0.2 更新仅适用于 iPhone 15、iPhone 15 Plus、iPhone 15 Pro 和 …...

面试题库(八):docker和linux

docker docker的原理?dockerfile里面用过什么命令?用过docker?dockerfile写过吗,常用命令,说下分层原理docker 部署有什么好处?docker 的底层原理是什么?namespace 和 cgroups,一个隔离环境,一个控制资源配额。那隔离环境主要隔离什么环境?docker镜像和容器有什么区别…...

深入理解传输层协议:TCP与UDP的比较与应用

目录 前言什么是TCP/UDPTCP/UDP应用TCP和UDP的对比总结 前言 传输层是TCP/IP协议栈中的第四层&#xff0c;它为应用程序提供服务&#xff0c;定义了主机应用程序之间端到端的连通性。在本文章&#xff0c;我们将深入探讨传输层协议&#xff0c;特别是TCP和UDP协议的原理和区别…...

Python-表白小程序练习

测试代码 在结果导向的今天&#xff0c;切勿眼高于顶&#xff0c;不论用任何方法能转换、拿出实际成果东西才是关键&#xff0c;即使一个制作很简易的程序&#xff0c;你想将其最终生成可运行的版本也是需要下一番功夫的。不要努力成为一个嘴炮成功者,要努力成为一个有价值的人…...

浅谈ChatGPT附免费体验地址

首先&#xff0c;让我来介绍一下ChatGPT是什么。ChatGPT是由OpenAI开发的大型语言模型&#xff0c;它代表着自然语言处理领域的最新进展。这个模型是通过大量的数据和先进的深度学习技术训练而成&#xff0c;具备了强大的语言理解和生成能力。 那么&#xff0c;ChatGPT能做些什…...

队列的使用以及模拟实现(C++版本)

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…...

RV1126笔记四十一:RV1126移植LIVE555

若该文为原创文章,转载请注明原文出处。 RV1126的SDK有提供了一个librtsp.a封装好的RTSP推流库,但不开源,还有个确定延时长,所以想自己写一个RTSP的推流,但不想太麻烦,所以使用Live555。 记录下移植过程和测试结果。 live555需要用到的包有 openssl 和live555 一、 编…...

stable diffusion模型评价框架

GhostReview:全球第一套AI绘画ckpt评测框架代码 - 知乎大家好&#xff0c;我是_GhostInShell_&#xff0c;是全球AI绘画模型网站Civitai的All Time Highest Rated (全球历史最高评价) 第二名的GhostMix的作者。在上一篇文章&#xff0c;我主要探讨自己关于ckpt的发展方向的观点…...

电脑开机慢问题的简单处理

电脑用久了&#xff0c;开机时间要10-20分钟特别慢&#xff0c;一下介绍两种简单有效处理方式&#xff0c;这两种方式经测试不会影响原系统软件的使用&#xff1a; 方式一&#xff1a;禁用非必要启动项【效果不是很明显】 利用360里面的优化加速禁用启动项【禁用启动项还有其…...

SpringMVC-Rest风格

一、简介 REST&#xff08;Representational State Transfer&#xff09;&#xff0c;表现形式状态转换,它是一种软件架构风格 当我们想表示一个网络资源的时候&#xff0c;可以使用两种方式: 传统风格资源描述形式 http://localhost/user/getById?id1 查询id为1的用户信息…...

WebGL实现透明物体(α混合)

目录 α混合 如何实现α混合 1. 开启混合功能&#xff1a; 2. 指定混合函数 混合函数 gl.blendFunc&#xff08;&#xff09;函数规范 可以指定给src_factor和dst_factor的常量 混合后颜色的计算公式 加法混合 半透明的三角形&#xff08;LookAtBlendedTriangl…...

RecycleView刷新功能

RecycleView刷新某一个Item&#xff0c;或这某一个Item中某一个View。 这样的需求&#xff0c;在实际的开发中是很普遍的。 在数据变化后需要刷新列表。 刷新列表有三种方式&#xff1a; 前两种大家应该很熟&#xff0c;第三中会有点陌生。 那么这三种方式&#xff0c;有什…...

目标检测如何演变:从区域提议和 Haar 级联到零样本技术

目录 一、说明 二、目标检测路线图 2.1 路线图&#xff08;一般&#xff09; 2.2 路线图&#xff08;更传统的方法&#xff09; 2.3 路线图&#xff08;深度学习方法&#xff09; 2.4 对象检测指标的改进 三、传统检测方法 3.1 维奥拉-琼斯探测器 (2001) 3.2 HOG探测器…...

聊一聊国内大模型公司,大模型面试心得、经验、感受

有着过硬的技术却无处可用是不是很苦恼呢&#xff0c;大家在面试时是不是也积累了一些经验呢&#xff0c;本文详细总结了大佬在大模型面试时的一些经验及感悟&#xff0c;希望对大家面试找工作有所帮助。 2023年&#xff0c;大模型突然国内火了起来&#xff0c;笔者就面了一些…...

【分布式微服务】feign 异步调用获取不到ServletRequestAttributes

公司调用接口的时候使用feign,但是服务之间还是使用了鉴权,需要通过RequestInterceptor 去传递uuid 概念 OpenFeign是一个声明式的Web服务客户端,它使得编写HTTP客户端变得更简单。在使用OpenFeign进行异步调用时,你可以通过配置来实现。但是,如果你在配置或调用过程中遇…...

c#编程里面最复杂的技术问题有哪些

C#编程中最复杂的技术问题通常涉及高级主题和复杂的应用场景。以下是一些可能被认为是C#编程中最复杂的技术问题&#xff1a; 1. **多线程和并发编程&#xff1a;** 处理多线程和并发问题涉及到锁定、线程同步、死锁避免、线程安全性和性能优化等方面的知识。编写高效且线程安…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...