项目场景:
在做一个Linux应用开发项目时需要移植第三方库:freetype、tslib、libpng等,在Ubuntu上编写应用程序,需要先手工交叉编译这些库软件
问题描述
但是交叉编译程序时总是出现找不到头文件夹,找不到相关函数的bug报错,但是sudo find / -name xxx 一搜不就在那吗,臭骂了交叉编译器无数遍…
- tslib.h头文件找不到:
touchscreen.c:4:19: fatal error: tslib.h: No such file or directory
#include <tslib.h>
^
compilation terminated.
- ft2build.h头文件找不到
freetype.c:14:22: fatal error: ft2build.h: No such file or directory
#include <ft2build.h>
^
compilation terminated.
- xxx 函数未定义
undefined reference to `xxx'
原因分析:
对Linux下程序运行知识的不了解造成的,编译程序、链接程序、运行程序需要的一些头文件和库文件应放置在相对应的交叉编译工具链的include和lib目录中,编译器在编译、链接、运行程序时会去这些目录中寻找
以tslib.h这个头文件为例:经过全局搜索tslib.h文件发现,我的tslib.h放置在/home/aming/tools/tslib/include/tslib.h
这个目录中,即我1手动交叉编译第三方库软件所放置的目录,如下:
sudo find / -name tslib.h
[sudo] password for aming:
/home/aming/tools/tslib/include/tslib.h
/home/aming/tools/tslib-1.21/src/tslib.h
很明显,这个tslib.h头文件只在这两个目录中,而不在交叉编译工具链的目录中,所以编译器确实找不到,不能怪他,怪自己没有放到该放的地方!
解决方案:
有两种解决办法,要么把相应头文件和库文件放置到系统指定目录中,要么手动指定目录
- 放置到系统指定目录:
怎么确定“系统目录”?执行下面命令确定目录:
echo 'main(){}'| arm-buildroot-linux-gnueabihf-gcc -E -v –
它会列出头文件目录、库目录(LIBRARY_PATH),你编译出头文件和库文件时,可以
把它们放入系统库目录,以tslib库为例,进入到tslib文件夹(即我交叉编译的tslib库位置
),输入如下命令:即可将tslib所需库文件放进系统目录,
cp -d lib/*so* /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib/
/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib/
即为我的交叉编译工具链的lib目录
- 手动指定目录
在Makefile中手动指定,编译时用 “ -I dir ”选项指定,链接时用 “ -L dir ”选项指定,想链接 libtslib.so,那链接时加上:-lts,以tslib.h头文件为例:在Makefile中加入:
CFLAGS += -I /home/aming/tools/tslib/include
LDFLAGS := -lts
export CFLAGS LDFLAGS
编译结果
如下图,按照类似操作完成各个第三方库的头文件、库文件的添加后,交叉编译成功通过!