实用知识库
柔彩主题三 · 更轻盈的阅读体验

编译时依赖和运行时依赖有什么区别?游戏开发中的实际应用

发布时间:2025-12-14 19:29:01 阅读:339 次

编译依赖运行时依赖有什么不同

在做游戏配置或者自己搭项目的时候,经常会看到“编译时依赖”和“运行时依赖”这两个词。听起来挺专业,其实搞明白它们的区别,对打包、调试甚至减小游戏体积都有帮助。

简单说,编译时依赖是你写代码、打包程序时需要的东西。比如你用C++写游戏,引用了一个数学库里的向量运算类,这个库必须在编译阶段就存在,否则代码通不过。但一旦编译完成,生成了可执行文件,这个库是不是还留在电脑上,就不一定了——如果它已经被静态链接进去了,那就不需要额外安装。

#include <glm/glm.hpp>  // 这个头文件就是编译时需要的

int main() {
    glm::vec3 position(1.0f, 2.0f, 3.0f);  // 使用GLM库
    return 0;
}

上面这段代码里,glm 是一个常用的图形数学库。你在编译时必须让编译器能找到这个头文件,否则报错。但它属于纯头文件库,不涉及运行时动态链接,所以打包完的游戏本体发给别人,不需要额外带这个库文件。

运行时依赖是启动游戏才要的东西

和编译时不一样,运行时依赖是你双击游戏图标准备运行时,系统得找得到的那些文件。最常见的就是DLL(Windows)或so(Linux)这类动态库。

比如你用了SDL2来处理窗口和输入,编译时当然要用它的头文件和lib文件,但如果你是动态链接SDL2,那最终生成的游戏程序运行时,必须在同一目录或系统路径下找到 SDL2.dll。少这个文件,点开就弹错:“找不到SDL2.dll”。

这时候玩家就懵了:我只想玩个游戏,怎么还要自己去下载DLL?所以很多独立游戏开发者干脆选择静态链接,把SDL2直接塞进exe里,虽然文件大一点,但扔给朋友直接能跑。

游戏配置中怎么注意这两类依赖

当你用构建工具比如CMake、Gradle或者Unity的Package Manager加插件时,其实就在管理依赖。有些包明确标注“仅编译时使用”,比如一些代码生成工具或注解处理器,它们只参与构建流程,不会被打进最终APK或exe。

而像音频解码库、网络通信模块、物理引擎这些,往往是运行时必需的。如果你在Steam上传游戏,忘了把 fmod.dllPhysX 相关的动态库一起打包,玩家启动就会崩溃。

反过来,如果你在做Android游戏,用到了某些Java/Kotlin的工具库,可能只是在编译期间做检查或优化,这种就不该打包进APK,否则只会增加安装包体积。

搞清楚哪些是“盖房子时用的脚手架”(编译时),哪些是“房子建成后还得撑着墙的柱子”(运行时),才能更高效地发布游戏。