WSL环境下Rust调用C函数遇linking with `cc`失败错误求解决
解决WSL2下Rust调用C函数的链接错误
问题描述
在WSL2(Windows 11 + Ubuntu 20.04.4 LTS)环境中,尝试从Rust调用C函数时出现链接错误,相同操作在Mac上可正常运行。rustc版本为1.63.0,执行以下命令时出错:
$ clang doubler.c -c $ rustc main.rs -l doubler.o -L .
错误核心信息:
/usr/bin/ld: cannot find -ldoubler.o collect2: error: ld returned 1 exit status
相关源码:
C头文件 doubler.h
const int FACTOR = 2; int doubler(int x);
C实现文件 doubler.c
#include "doubler.h" extern const int FACTOR; int doubler(int x) { return x * FACTOR; }
Rust主文件 main.rs
extern "C" { fn doubler(x: i32) -> i32; } fn main() { unsafe { println!("{}", doubler(1)); } }
解决方案
方法一:直接链接目标文件
rustc的-l参数用于链接库文件(如libxxx.a或libxxx.so),而.o目标文件需要直接作为编译参数传入,无需-l。修改后的命令:
rustc main.rs doubler.o
方法二:打包为静态库后链接
如果习惯使用-l参数,可以先将目标文件打包成静态库,再进行链接:
- 生成静态库:
ar rcs libdoubler.a doubler.o
- 链接静态库:
rustc main.rs -l doubler -L .
原因说明
Linux下的链接器ld对-l参数的处理严格遵循规则:-lxxx会查找libxxx.a或libxxx.so文件,而Mac的链接器对该参数的处理更宽松,允许直接指定.o文件,这就是相同命令在Mac可用但WSL2下出错的原因。
内容的提问来源于stack exchange,提问作者Yoshikuni Kato
相关产品推荐
相关产品推荐

