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

MSYS2 UCRT64下ld找不到-lpython39库问题咨询

问题背景

使用适配MSYS2环境GNU ABI的rustup版本构建依赖Python的Rust项目时,执行cargo build触发ld链接器报错,提示无法找到Python对应库,相关报错片段如下:

= note: C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/12.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lpython3

实际MSYS2 UCRT64终端中可正常运行Python 3.9,which python返回安装路径为C:/msys64/ucrt64/bin/python;脱离cargo环境直接执行ld -lpython39可复现完全相同的报错:

$ ld -lpython39
C:\msys64\ucrt64\bin\ld.exe: cannot find -lpython39: No such file or directory

待确认问题包括:

  • python39已在环境默认路径下时,ld是否仍需要通过-L参数指定库文件路径
  • 若需要添加-L参数,如何在cargo中完成对应配置
  • 是否需要放弃rustup、改用MSYS2软件源自带的Rust版本(Rust官方不推荐使用MSYS2自带Rust方案)
问题解答

1. ld是否需要手动指定-L参数

需要。MSYS2 UCRT64环境下,Python可执行文件存放在/ucrt64/bin目录,但链接阶段需要的导入库libpython3.9.dll.a、静态库都存放在/ucrt64/lib目录。ld的默认搜索路径不会自动关联Python对应的库目录,哪怕python命令已经加入PATH可以直接调用,链接阶段也不会自动搜索到对应库文件,这也是直接执行ld -lpython39会报错的核心原因。
可以先执行如下命令验证路径问题:

ld -L/c/msys64/ucrt64/lib -lpython39

执行后无报错即可确认是库搜索路径缺失导致的问题。

2. Cargo中添加-L参数的配置方法

两种常用方案,按需选择即可:

  • 临时配置(适合调试场景)
    执行构建前先在当前MSYS2 UCRT64终端设置RUSTFLAGS环境变量,传入链接搜索路径:
    export RUSTFLAGS="-L C:/msys64/ucrt64/lib"
    cargo build
    
    该配置仅对当前终端会话生效,关闭终端后失效。
  • 永久项目配置(推荐日常使用)
    在项目根目录新建.cargo/config.toml文件,添加针对GNU ABI Windows目标的链接参数配置:
    [target.x86_64-pc-windows-gnu]
    rustflags = ["-L", "C:/msys64/ucrt64/lib"]
    
    如果项目使用pyo3等Rust-Python绑定库,也可以在build.rs构建脚本中自动探测MSYS2环境下的Python库路径,避免硬编码绝对路径带来的兼容性问题。

3. 是否需要更换为MSYS2源自带的Rust版本

不需要。rustup安装的GNU ABI版本Rust完全可以在MSYS2 UCRT64环境下正常工作,本次报错的核心原因是链接搜索路径配置缺失,和Rust的安装来源没有关系。MSYS2软件源提供的Rust版本更新通常滞后于官方发布渠道,还会和rustup的工具链管理逻辑产生冲突,在官方明确不推荐该方案的前提下,没有必要更换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:21:28