【小沐学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
Action | Description |
---|---|
vs2022 | Generate Visual Studio 2022 project files |
vs2019 | Generate Visual Studio 2019 project files |
vs2017 | Generate Visual Studio 2017 project files |
vs2015 | Generate Visual Studio 2015 project files |
vs2013 | Generate Visual Studio 2013 project files |
vs2012 | Generate Visual Studio 2012 project files |
vs2010 | Generate Visual Studio 2010 project files |
vs2008 | Generate Visual Studio 2008 project files |
vs2005 | Generate Visual Studio 2005 project files |
gmake | Generate GNU Makefiles (This generator is deprecated by gmake2) |
gmake2 | Generate GNU Makefiles (including Cygwin and MinGW) |
xcode4 | XCode projects |
codelite | CodeLite 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:入门例子4.2 测试2:…...

Linux shell编程学习笔记2:我是谁 | who am i ?
〇、更新记录 20230926 补充例子2 一、前言 由于Linux系统的shell有许多种:sh、bash、cshell、tcsh、zsh……这些shell以sh为基础对象,在保持兼容性时又各有有创建,形成自己的功能特点,要想让我们编写的shell代码正确、可靠运行…...
移动端和PC端对比【组件库+调试vconsole +单位postcss-pxtorem+构建vite/webpack+可视化echarts/antv】
目录 组件库 移动端 vue vant PC端 react antd vue element 调试:vconsole vs dev tools中的控制台(Console) vconsole:在真机上调试 postcss-pxtorem:移动端不同的像素密度 构建工具 webpack 原理 Ba…...

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

iOS17.0.2更新修复iPhone 15系列机型数据迁移问题,附新机快速数据迁移办法!
iPhone 15 系列机型已于今日正式发售,为解决iPhone15这些机型出现的数据迁移问题,苹果紧急发布了 iOS 17.0.2 更新,内部版本号为 21A350。 需要注意的是, 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协议栈中的第四层,它为应用程序提供服务,定义了主机应用程序之间端到端的连通性。在本文章,我们将深入探讨传输层协议,特别是TCP和UDP协议的原理和区别…...
Python-表白小程序练习
测试代码 在结果导向的今天,切勿眼高于顶,不论用任何方法能转换、拿出实际成果东西才是关键,即使一个制作很简易的程序,你想将其最终生成可运行的版本也是需要下一番功夫的。不要努力成为一个嘴炮成功者,要努力成为一个有价值的人…...
浅谈ChatGPT附免费体验地址
首先,让我来介绍一下ChatGPT是什么。ChatGPT是由OpenAI开发的大型语言模型,它代表着自然语言处理领域的最新进展。这个模型是通过大量的数据和先进的深度学习技术训练而成,具备了强大的语言理解和生成能力。 那么,ChatGPT能做些什…...

队列的使用以及模拟实现(C++版本)
🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻强烈推荐优质专栏: 🍔🍟🌯C的世界(持续更新中) 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔…...

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

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

电脑开机慢问题的简单处理
电脑用久了,开机时间要10-20分钟特别慢,一下介绍两种简单有效处理方式,这两种方式经测试不会影响原系统软件的使用: 方式一:禁用非必要启动项【效果不是很明显】 利用360里面的优化加速禁用启动项【禁用启动项还有其…...
SpringMVC-Rest风格
一、简介 REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格 当我们想表示一个网络资源的时候,可以使用两种方式: 传统风格资源描述形式 http://localhost/user/getById?id1 查询id为1的用户信息…...

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

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

目标检测如何演变:从区域提议和 Haar 级联到零样本技术
目录 一、说明 二、目标检测路线图 2.1 路线图(一般) 2.2 路线图(更传统的方法) 2.3 路线图(深度学习方法) 2.4 对象检测指标的改进 三、传统检测方法 3.1 维奥拉-琼斯探测器 (2001) 3.2 HOG探测器…...
聊一聊国内大模型公司,大模型面试心得、经验、感受
有着过硬的技术却无处可用是不是很苦恼呢,大家在面试时是不是也积累了一些经验呢,本文详细总结了大佬在大模型面试时的一些经验及感悟,希望对大家面试找工作有所帮助。 2023年,大模型突然国内火了起来,笔者就面了一些…...
【分布式微服务】feign 异步调用获取不到ServletRequestAttributes
公司调用接口的时候使用feign,但是服务之间还是使用了鉴权,需要通过RequestInterceptor 去传递uuid 概念 OpenFeign是一个声明式的Web服务客户端,它使得编写HTTP客户端变得更简单。在使用OpenFeign进行异步调用时,你可以通过配置来实现。但是,如果你在配置或调用过程中遇…...
c#编程里面最复杂的技术问题有哪些
C#编程中最复杂的技术问题通常涉及高级主题和复杂的应用场景。以下是一些可能被认为是C#编程中最复杂的技术问题: 1. **多线程和并发编程:** 处理多线程和并发问题涉及到锁定、线程同步、死锁避免、线程安全性和性能优化等方面的知识。编写高效且线程安…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...