基于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)
求助需求
需要正确完成以下步骤:
- 引入第三方开源项目(Godot)
- 在自有项目中包含该开源项目的头文件
- 使用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,你的配置已匹配)
第三步:验证构建流程
- 清理之前的构建产物:
scons -c - 重新执行SCons:
scons - 若仍有链接错误,检查Godot的编译目标(debug/release)与项目配置是否一致,以及库文件路径是否正确
内容的提问来源于stack exchange,提问作者kekekuli
相关产品推荐
相关产品推荐

