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"  -- 开启优化
相关推荐
X_StarX30 分钟前
【Unity笔记01】基于单例模式的简单UI框架
笔记·ui·unity·单例模式·游戏引擎·游戏开发·大学生
pipip.1 小时前
UDP————套接字socket
linux·网络·c++·网络协议·udp
孞㐑¥6 小时前
Linux之Socket 编程 UDP
linux·服务器·c++·经验分享·笔记·网络协议·udp
Hacker_Oldv6 小时前
软件测试(功能、工具、接口、性能、自动化、测开)详解
运维·自动化
Java樱木6 小时前
使用字节Trae + MCP,UI 到网页自动化。
运维·自动化
水木兰亭9 小时前
数据结构之——树及树的存储
数据结构·c++·学习·算法
CoderCodingNo10 小时前
【GESP】C++四级考试大纲知识点梳理, (7) 排序算法基本概念
开发语言·c++·排序算法
秋风&萧瑟11 小时前
【C++】C++中的友元函数和友元类
c++
梁诚斌12 小时前
使用OpenSSL接口读取pem编码格式文件中的证书
开发语言·c++
小小鱼儿小小林12 小时前
免费一键自动化申请、续期、部署、监控所有 SSL/TLS 证书,ALLinSSL开源免费的 SSL 证书自动化管理平台
开源·自动化·ssl