嵌入式开发中常用到交叉编译,一般在没有复杂依赖关系时可以直接编译。但如果依赖其它的库,编译时需要先来交叉编译库,再来交叉编译应用程序,以本例程依赖的curl为例进行描述:
没有依赖库,第一次编译时会提示如下错误
arm-linux-gnueabihf-gcc SpeakerSimu.c -o speak -lcurl -ljanssonvlc
SpeakerSimu.c:15:25: fatal error: curl/curl.h: 没有那个文件或目录
#include <curl/curl.h>
^
compilation terminated.
根据错误提示下载curl源码进行交叉编译,过程如下:
cd curl-4.74.0
./configure --host=arm-linux-gnueabihf --build=x86_64-pc-linux-gnu --prefix=/home/carl/work/rk3229/work/curl_build
make
make install
此处遇到的问题点:我使用的是交叉编译工具链为arm-linux-gnueabihf-gcc,版本号如下
gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4)
下载的源码为2017年11月29号最新release的curl-7.57.0.tar.gz版本,交叉编译时报错
configure: error: Unable to link function recv
网上没有查到具体的错误原因,只在网站上写这降到curl7.47版本可以正常使用,因此后续使用此版本进行编译。可能更新交叉编译链版本也能解决次问题。
安装完成之后会在curl_build目录下生成对应的include头文件和lib库
至此可以使用新生成的头文件和库交叉编译应用程序:
arm-linux-gnueabihf-gcc SpeakerSimu.c -o SpeakerSimu -lcurl -I/home/carl/work/rk3229/work/curl_build/include -L/home/carl/work/rk3229/work/curl_build/lib
NOTE:生成的可执行文件移植到开发板后运行时需要开发板中的curl运行环境,如果开发板中库版本与交叉编译使用的库版本不一致,也可能出现其它问题。