You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Godot源码构建可执行程序的SCons链接问题求助

环境配置

  • Windows 11
  • Visual Studio 2022(包含Windows 11 SDK、MSVC v143编译器)
  • VSCode 作为编辑器
  • SCons v4.8.1(搭配Python 3.12.7)
  • Godot 4.4 源码

场景说明

我对源码链接库的方式不太熟悉,这次场景更复杂:想在自己的实验项目中使用Godot开源项目的io模块代码做实验。

目录结构

D:
 -> Godot
   -> 其他无关源码
   -> core
      -> io 
   -> platform
      -> windows
 -> Experiment
   -> input.expr.cpp

VSCode IntelliSense配置(已正常工作)

通过配置c_cpp_properties.json,VSCode的自动补全、代码片段功能正常,配置内容如下:

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "C:/Users/15070/Workspace/godot",
                "C:/Users/15070/Workspace/godot/platform/windows"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "C:\\Users\\15070\\Program\\VisualStudio\\IDE\\VC\\Tools\\MSVC\\14.38.33130\\bin\\Hostx64\\x64\\cl.exe",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "windows-msvc-x64"
        }
    ],
    "version": 4
}

实验代码

我的实验代码input.expr.cpp仅包含Godot源码的部分头文件并使用其中类:

#include "core/io/file_access.h"
#include "core/io/file_access_encrypted.h"

int main(){
    FileAccess * file;
    // 使用file_access和file_access_encrypted中声明的类
    // ...
    return 0;
}

SConstruct配置

完成代码后尝试用SCons构建,编写的SConstruct如下(大部分由GitHub Copilot或网络生成,我对构建逻辑和SCons原理不熟悉):

import os

depends = [
    "C:/Users/15070/Workspace/experiment",
    "C:/Users/15070/Workspace/godot",
    "C:/Users/15070/Workspace/godot/platform/windows",
]
current_path = os.environ['PATH']

additional_paths = [
    "C:/Users/15070/Program/VisualStudio/IDE/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/",
]

path = current_path + os.pathsep + os.pathsep.join(additional_paths)

env = Environment(
    CPPPATH=depends,
    ENV={"PATH":path},
    CXXFLAGS=[
        "/std:c++17", 
        "/Zc:__cplusplus"
    ],
)

env.Program("input.expr.cpp")

构建错误日志

运行SCons后,编译成功生成input.expr.obj,但链接阶段失败,关键日志:

cl /Foinput.expr.obj /c input.expr.cpp /std:c++17 /Zc:__cplusplus /nologo /I. /IC:\Users\15070\Workspace\godot /IC:\Users\15070\Workspace\godot\platform\windows
input.expr.cpp
link /nologo /OUT:input.expr.exe input.expr.obj
LINK : fatal error LNK1104: 无法打开文件“C:\windows\lnk{D7A6DFED-1BA3-4827-958F-C95087FD1366}.tmp”

补充信息

  • 已成功用SCons构建过Godot可执行程序
  • 本地PATH环境变量:
C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\Program Files\HP\OMEN-Broadcast\Common;C:\Program Files\Git\cmd;C:\Program Files\Microsoft SQL Server\150\Tools\Binn\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\;C:\Program Files\dotnet\;C:\Windows Kits\10\Windows Performance Toolkit\;C:\lua-5.4.2_Win64_bin\;C:\Program Files\HP\HP One Agent;C:\Program Files (x86)\GtkSharp\2.12\bin;C:\Program Files\Docker\Docker\resources\bin;C:\Users\15070\.jdks\corretto-1.8.0_412\bin;C:\Program Files\nodejs\;
  • TEMP变量:%USERPROFILE%\AppData\Local\Temp(USERPROFILE为C:/Users/15070)

求助需求

需要正确完成以下步骤:

  1. 引入第三方开源项目(Godot)
  2. 在自有项目中包含该开源项目的头文件
  3. 使用SCons构建自有项目

解决方案

第一步:解决当前链接错误(LNK1104临时文件问题)

这个临时文件错误并非Godot链接问题,是Windows权限或TEMP目录异常导致的:

  • 以管理员身份运行VSCode/终端后重新执行SCons
  • 手动清理C:\Users\15070\AppData\Local\Temp目录下的缓存文件
  • 检查系统TEMP目录权限,确保当前用户对%USERPROFILE%\AppData\Local\Temp有读写权限

第二步:正确引入Godot依赖并链接

你的代码只包含了头文件,但未链接Godot编译后的库文件,这是后续会遇到的核心问题(当前错误只是前置障碍)。正确步骤如下:

1. 预编译Godot核心库

先在Godot源码目录下用SCons编译出io模块依赖的核心库:

# 进入Godot源码目录
cd C:/Users/15070/Workspace/godot
# 编译Windows平台的静态库(Debug模式)
scons platform=windows target=debug production=no

编译完成后,Godot会在bin目录生成相关库文件,比如godot.windows.debug.x86_64.lib(静态库)或对应的动态库。

2. 修改SConstruct配置

需要在构建环境中添加库文件路径和要链接的库名,修改后的SConstruct:

import os

# 项目依赖路径
godot_root = "C:/Users/15070/Workspace/godot"
depends = [
    os.getcwd(),
    godot_root,
    os.path.join(godot_root, "platform", "windows"),
]

# 编译器路径配置
msvc_bin_path = "C:/Users/15070/Program/VisualStudio/IDE/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/"
env_path = os.environ['PATH'] + os.pathsep + msvc_bin_path

# 构建环境
env = Environment(
    CPPPATH=depends,
    ENV={"PATH": env_path, "TEMP": os.environ['TEMP'], "TMP": os.environ['TMP']},  # 显式传递TEMP变量
    CXXFLAGS=[
        "/std:c++17", 
        "/Zc:__cplusplus",
        "/MDd"  # 与Godot Debug编译的运行时库匹配,Debug用/MDd,Release用/MD
    ],
    # 添加Godot库路径和库名
    LIBPATH=[os.path.join(godot_root, "bin")],
    LIBS=["godot.windows.debug.x86_64.lib"]
)

# 构建目标程序
env.Program("input.expr.exe", ["input.expr.cpp"])

3. 确保编译选项匹配

  • 运行时库必须一致:Godot Debug模式用/MDd,Release用/MD,你的项目要对应设置,否则会出现链接错误
  • C标准保持与Godot一致(Godot 4.4默认用C17,你的配置已匹配)

第三步:验证构建流程

  1. 清理之前的构建产物:scons -c
  2. 重新执行SCons:scons
  3. 若仍有链接错误,检查Godot的编译目标(debug/release)与项目配置是否一致,以及库文件路径是否正确

内容的提问来源于stack exchange,提问作者kekekuli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:20:56