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
相关产品推荐
相关产品推荐

