ATEngin开发记录_4_使用Premake5 自动化构建跨平台项目文件

该系列只做记录 不做教程 所以文章简洁直接 会列出碰到的问题和解决方案 只适合C++萌新

文章目录


Permake5

Premake5 是一个跨平台的构建配置工具,它允许开发者通过使用一个简单的脚本语言(Lua)来定义项目的构建过程。Premake5 主要用于生成适用于不同平台的项目文件(如 Visual Studio、Xcode、Makefile 等),并且可以自动化构建过程、依赖关系管理和平台配置。它的目的是简化和统一多个平台的构建工作,特别适用于 C++ 项目。

GitHub链接: premake-core


为什么使用 Premake?

1.跨平台支持: Premake5 支持多个平台,包括 Windows、Linux、macOS 等。你可以使用一个脚本文件为不同的操作系统生成相应的构建文件,比如 Visual Studio 项目、Xcode 工程、Makefile 等。

2.Lua 脚本语言: Premake5 使用 Lua 语言来定义项目的构建配置。这使得构建脚本非常灵活和易于定制。Lua 作为一种轻量级的脚本语言,可以方便地扩展和修改,使得 Premake5 的使用既直观又功能强大。

3.简化的项目定义: 与其他构建系统(如 CMake、SCons 等)相比,Premake5 的脚本文件语法更为简洁直观。你只需要定义基本的项目配置(如源文件、目标文件、库、编译选项等),Premake 会根据配置自动生成适合各平台的构建文件。

4.配置灵活性: Premake5 支持多个构建配置(如 Debug、Release、Dist 等),并允许开发者为每种配置设置不同的编译选项、宏定义、优化级别等。你可以为不同的构建模式(调试、发布等)指定不同的设置。

5.集成与扩展: 通过 Lua 脚本,Premake5 提供了高度的扩展性。你可以创建自定义的构建逻辑,集成其他工具(如单元测试、静态分析工具、代码格式化工具等),或者根据需要定制构建过程。

6.生成的项目文件标准化: Premake5 的一个重要特点是生成的项目文件标准化且易于管理。无论是在团队中协作开发,还是在版本控制系统中,Premake5 脚本文件本身是纯文本格式的,可以直接进行版本管理。这避免了 IDE 特定配置(如 Visual Studio 或 Xcode 的特定设置)带来的问题。

7.与现有构建系统的兼容性: Premake5 能与现有的构建系统兼容。例如,你可以用 Premake 生成 Visual Studio 或 Xcode 的项目文件,但仍然可以通过这些工具继续执行编译工作。这提供了灵活性,尤其适合现有大型项目。

一个简单的 Premake5 脚本示例如下:

javascript 复制代码
-- 定义工作区
workspace "MyGameEngine"
    configurations { "Debug", "Release" }

-- 定义项目
project "MyEngine"
    kind "StaticLib"
    language "C++"
    files { "src/**/*.cpp", "src/**/*.h" }

    -- 设置包含路径
    includedirs { "include", "external/spdlog/include" }

    -- Windows 平台的设置
    filter "system:windows"
        systemversion "latest"
        staticruntime "On"

    -- Debug 配置的设置
    filter "configurations:Debug"
        defines { "DEBUG" }
        symbols "On"

    -- Release 配置的设置
    filter "configurations:Release"
        defines { "NDEBUG" }
        optimize "On"

项目实战

总结一下:

1.主要是文件夹路径 和 .h .cpp文件要选择好,不要选错文件 和多选其它第三方库

2.以及拷贝Dll的时候 拷贝到运行目录

3.使用 UTF-8 编码的多字节字符集 -> buildoptions { "/utf-8" }

详细代码:

javascript 复制代码
workspace "ATEngine"
    architecture "x64"  -- 指定项目的架构为x64
    configurations { "Debug", "Release", "Dist" }  -- 配置项目的构建模式:Debug(调试),Release(发布),Dist(发布版)

outputdir = "%{cfg.buildcfg}-%{cfg.system}-%{cfg.architecture}"  -- 输出目录的格式,结合构建配置、系统和架构

-- ===============================
-- ATEngine 项目(DLL 动态库)
-- ===============================
project "ATEngine"
    location "ATEngine"  -- 项目的位置
    kind "SharedLib"  -- 目标类型为共享库(动态库)
    language "C++"  -- 使用 C++ 编程语言
    buildoptions { "/utf-8" }  -- 构建选项,设置文件编码为 UTF-8
    targetdir ("x64/Debug/" .. outputdir .."/%{prj.name}")  -- 设置目标输出目录
    objdir ("x64/Debug/" .. outputdir .."/%{prj.name}")  -- 设置对象文件输出目录

    -- 添加项目需要的源文件
    files 
    {
        "%{prj.name}/Scripts/**.h",  -- 所有头文件
        "%{prj.name}/Scripts/**.cpp" -- 所有源文件
    }

    -- 移除不需要编译的文件
    removefiles
     {
        "%{prj.name}/Scripts/ATEngine/vendor/spdlog/**.cpp"  -- 移除spdlog库的cpp文件
    }

    -- 添加需要包含的头文件目录
    includedirs
     {
        "%{prj.name}/Scripts/ATEngine/vendor/spdlog/include"  -- spdlog库的头文件目录
    }

    filter "system:windows"  -- 针对Windows系统的构建配置
        cppdialect "C++17"  -- 使用C++17标准
        staticruntime "On"  -- 使用静态链接运行时库
        systemversion "10.0.22621.0"  -- 设置Windows的SDK版本

        defines {
            "HZ_PLATFORM_WINDOWS",  -- 定义平台为Windows
            "HZ_BUILD_DLL"  -- 定义为DLL构建
        }

        postbuildcommands {
            -- 在构建后,将目标文件复制到Sandbox目录
            "{COPY} %{cfg.buildtarget.relpath} ../x64/Debug/" .. outputdir .. "/Sandbox"
        }

    -- 配置不同构建模式的设置
    filter "configurations:Debug"
        defines "HZ_DEBUG"  -- 定义调试模式
        symbols "On"  -- 开启调试符号

    filter "configurations:Release"
        defines "HZ_RELEASE"  -- 定义发布模式
        optimize "On"  -- 开启优化

    filter "configurations:Dist"
        defines "HZ_DIST"  -- 定义发布版模式
        optimize "On"  -- 开启优化


-- ===============================
-- Sandbox 项目(最终程序)
-- ===============================
project "Sandbox"
    location "Sandbox"  -- 项目的位置
    kind "ConsoleApp"  -- 目标类型为控制台应用程序
    language "C++"  -- 使用 C++ 编程语言
    buildoptions { "/utf-8" }  -- 构建选项,设置文件编码为 UTF-8
    targetdir ("x64/Debug/" .. outputdir .. "/%{prj.name}")  -- 设置目标输出目录
    objdir ("x64/Debug/" .. outputdir .. "/%{prj.name}")  -- 设置对象文件输出目录

    -- 添加项目需要的源文件
    files 
    {
        "%{prj.name}/Scripts/**.h",  -- 所有头文件
        "%{prj.name}/Scripts/**.cpp" -- 所有源文件
    }

    -- 添加需要包含的头文件目录
    includedirs 
    {
        "ATEngine/Scripts/ATEngine/vendor/spdlog/include",  -- 引入 ATEngine 项目的 spdlog 库头文件目录
        "ATEngine/Scripts"  -- 引入 ATEngine 项目的源文件目录
    }

    -- 链接 ATEngine 动态库
    links
    {
        "ATEngine"
    }

    filter "system:windows"  -- 针对Windows系统的构建配置
        cppdialect "C++17"  -- 使用C++17标准
        staticruntime "On"  -- 使用静态链接运行时库
        systemversion "10.0.22621.0"  -- 设置Windows的SDK版本

        defines 
        {
            "HZ_PLATFORM_WINDOWS"  -- 定义平台为Windows
        }

    -- 配置不同构建模式的设置
    filter "configurations:Debug"
        defines "HZ_DEBUG"  -- 定义调试模式
        symbols "On"  -- 开启调试符号

    filter "configurations:Release"
        defines "HZ_RELEASE"  -- 定义发布模式
        optimize "On"  -- 开启优化

    filter "configurations:Dist"
        defines "HZ_DIST"  -- 定义发布版模式
        optimize "On"  -- 开启优化
相关推荐
12 分钟前
Unity 几种主流的热更新方式
java·unity·游戏引擎
夜月yeyue27 分钟前
静态库与动态库简介
linux·c++·stm32·单片机·嵌入式硬件
西装没钱买27 分钟前
QgraphicsView异步线程加载地图瓦片
开发语言·c++·qt·离线地图·graphicsview
yuanManGan1 小时前
C++入门小馆: 模板
开发语言·c++·算法
DARLING Zero two♡1 小时前
C++漫溯键值的长河:map && set
c++·stl·set·map·搜索二叉树
阿沁QWQ1 小时前
C++类和对象
开发语言·c++
序属秋秋秋1 小时前
《数据结构初阶》【顺序表/链表 精选15道OJ练习】
c语言·数据结构·c++·笔记·算法·链表
Zfox_3 小时前
【Qt】网络
开发语言·网络·c++·qt·qt5·客户端开发
古月฿3 小时前
流水线问题(算法设计)C++
开发语言·c++·算法
惊鸿醉4 小时前
Unity Post Processing 小记 【使用泛光实现灯光亮度效果】
笔记·unity·游戏引擎