【小沐学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. **多线程和并发编程:** 处理多线程和并发问题涉及到锁定、线程同步、死锁避免、线程安全性和性能优化等方面的知识。编写高效且线程安…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
