Windows7下SysGCC交叉编译树莓派项目报错:无法找到-lcurl -ljsoncpp
解决SysGCC交叉编译找不到curl/jsoncpp库的问题 + Makefile入门
嘿,我来帮你搞定这个交叉编译的坑!你遇到的ld.exe cannot find -lcurl -ljsoncpp本质是交叉编译器找不到适配树莓派ARM架构的库文件——毕竟Windows上的库和Pi2的ARM架构完全不兼容,之前在Pi上直接编译用的是Pi本地的库,换交叉编译就得给工具链准备对应的ARM版库。另外,既然项目有依赖了,确实该用Makefile了——手动敲编译命令太容易出错还麻烦,我给你一步步讲:
第一步:给交叉编译器准备ARM版的curl和jsoncpp库
你有两个靠谱的办法拿到适配Pi2的库:
方法1:从树莓派上直接拷贝现成库
Pi2用的是armhf架构,它的系统里库文件和头文件都在固定位置:
- 把Pi通过SSH连上,或者插SD卡到电脑上,找到
/usr/lib/arm-linux-gnueabihf/目录下的libcurl.so、libjsoncpp.so(或者对应的静态库.a文件),拷贝到Windows上SysGCC工具链的arm-linux-gnueabihf/lib文件夹里; - 再把
/usr/include/下的curl/整个文件夹和jsoncpp/相关头文件,拷贝到SysGCC的arm-linux-gnueabihf/include文件夹里。
这样交叉编译器编译时就能自动找到这些库和头文件了。
方法2:自己交叉编译curl和jsoncpp源码(更推荐,版本可控)
如果Pi上的库版本太旧或者你想自定义编译选项,就自己编译:
- 下载curl和jsoncpp的源码包;
- 打开SysGCC的终端(确保交叉编译器的命令在PATH里);
- 编译curl:
(./configure --host=arm-linux-gnueabihf --prefix=/path/to/your/arm-libs make && make install--prefix指定编译后库和头文件的输出目录,比如你可以在项目里建个arm-libs文件夹) - 编译jsoncpp:jsoncpp一般用CMake,所以要指定交叉编译工具链:
cmake -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc -DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ -DCMAKE_INSTALL_PREFIX=/path/to/your/arm-libs .. make && make install
编译完后,你的/path/to/your/arm-libs里就有include(头文件)和lib(库文件)两个文件夹了。
第二步:用Makefile简化编译流程
既然你之前没接触过Makefile,我给你写一个适配你场景的极简版Makefile,直接改路径就能用:
# 交叉编译器:如果是C++项目就换成arm-linux-gnueabihf-g++ CC = arm-linux-gnueabihf-gcc # 头文件搜索路径:把这里换成你刚才拷贝/编译出来的头文件目录,比如./arm-libs/include CFLAGS = -I./arm-libs/include -Wall -O2 # 库文件搜索路径:换成库文件所在目录,比如./arm-libs/lib LDFLAGS = -L./arm-libs/lib # 需要链接的库,就是你报错的那两个 LIBS = -lcurl -ljsoncpp # 你的源文件:把main.c换成你项目里的所有源文件,多个用空格分开 SRCS = main.c # 生成的可执行文件名,随便起 TARGET = pi-project # 默认执行的编译命令 all: $(TARGET) # 编译规则:用交叉编译器把源文件编译成可执行文件 $(TARGET): $(SRCS) $(CC) $(CFLAGS) $(SRCS) -o $(TARGET) $(LDFLAGS) $(LIBS) # 清理生成的可执行文件 clean: rm -f $(TARGET)
怎么用这个Makefile?
- 把Makefile放在你的项目根目录里;
- 打开SysGCC的终端,cd到项目目录;
- 敲
make,回车就能自动编译了; - 想清理编译出来的文件,敲
make clean就行。
额外小提示
- 一定要确认你用的库是ARM架构的,别不小心用了Windows的x86库,那肯定找不到;
- 如果用静态库(
.a文件),编译出来的可执行文件可以直接放到Pi上运行,不用拷贝动态库过去,更方便; - 编译时如果还是报错找不到库,检查一下
-L指定的路径是不是正确,库文件名是不是对(比如有没有写成libcurl.so.4这种带版本号的,链接时只用-lcurl就行,ld会自动找对应的文件)。
内容的提问来源于stack exchange,提问作者polyos
相关产品推荐
相关产品推荐

