SCons调用Clang交叉编译Windows程序时ld找不到标准库
问题原因
链接报错的核心原因是SCons默认分离了编译、链接阶段的参数传递,你当前配置把所有交叉编译参数都放在了仅编译阶段生效的CCFLAGS变量中,导致链接阶段丢失了交叉编译目标配置:
- 从scons执行日志可以看到,链接阶段执行的clang命令没有带
--target=x86_64-w64-windows-gnu参数,clang会默认调用Linux原生的/bin/ld,按Linux的库搜索路径找依赖,自然找不到Windows平台专属的opengl32/gdi32/winmm库。 - 手动执行clang命令时,单条命令同时覆盖编译、链接两个阶段,
--target参数全程生效,能正确匹配交叉编译环境的库搜索路径,所以可以正常构建。 - 编译阶段出现的参数未使用警告,是因为
-mwindows/-static-libgcc/-static-libstdc++都是链接阶段才生效的参数,放在编译阶段不会起作用。
修复方案
按参数作用阶段拆分配置:
- 交叉编译目标参数
--target=x86_64-w64-windows-gnu需要同时传递给编译、链接阶段,保证两个阶段都瞄准Windows平台 - 链接专属参数统一放到
LINKFLAGS变量中,不要塞到CCFLAGS里
修正后的SConstruct配置:
import os LIBS = ['raylib', 'opengl32', 'gdi32', 'winmm'] LIBPATH = './lib' env = Environment( CXX='clang++', CPPPATH='./include', # 编译阶段传入目标平台参数 CCFLAGS='--target=x86_64-w64-windows-gnu', # 链接阶段传入目标平台+静态链接+窗口子系统参数 LINKFLAGS='--target=x86_64-w64-windows-gnu -mwindows -static -static-libgcc -static-libstdc++' ) env['ENV']['TERM'] = os.environ['TERM'] # 保留编译输出彩色显示 env.Program('tiled_test.exe', 'main.cpp', LIBS=LIBS, LIBPATH=LIBPATH)
调整后重新执行scons即可正常构建,不需要手动把opengl32等Windows系统库复制到项目lib目录,交叉编译工具链会自动从自身sysroot路径搜索这些系统依赖。
内容的提问来源于stack exchange,提问作者MBR-6161
相关产品推荐
相关产品推荐

