离谱的交叉编译 Judy
背景
在交叉编译 netdata 的过程中,我需要编译 netdata 所依赖 Judy ,但是它的安装方式实在是有点迷。
Judy 安装包获取地址:https://nchc.dl.sourceforge.net/project/judy/judy/Judy-1.0.5/Judy-1.0.5.tar.gz
复现
进去直接交叉编译,如下:
cd cd judy-1.0.5/
./configure --host=arm-hisiv600-linux
make
然后出现以下的报错:
然后转到对应的 makefile 文件,看到:
JudyLTables.c: JudyLTablesGen.c
$(CC) $(INCLUDES) $(AM_CFLAGS) -UJU_64BIT -g -O2 -o JudyLTablesGen JudyLTablesGen.c; ./JudyLTablesGen
这里就可以看出问题了,我在交叉编译过程中去调用一个交叉编译中间产生的程序,这显然是不合理的,跟踪了一下发现这个可执行程序是生成 头文件 的,并不参与后面的编译。
所以可以把上面的修改成下面的:
JudyLTables.c: JudyLTablesGen.c
gcc -m32 $(INCLUDES) $(AM_CFLAGS) -UJU_64BIT -g -O2 -o JudyLTablesGen JudyLTablesGen.c; ./JudyLTablesGen
gcc
代表使用本地工具链,而 -m32
强制生成 32位 可执行程序,使产生的可执行程序尽可能跟目标机保持一致。
效果
总结
类似这种问题应该就只见过两次,一次是在编译 vsftpd 依赖库时,具体是啥我就忘记了,一次就是这个 Judy; 它们都有一个共同的特点,就是这个中间生成的可执行程序只是被当做一个脚本来用。
这是一种比较优雅的修改方式,但从理论上不是最好的,最好的做法就是 make
之后,直接跑到目标机去运行这个中间生成的可执行程序;但是麻烦的是这样就写不了脚本了;有舍有得。
总结一下,这个交叉编译出现的问题主要还是在于当初设计者没有很好的考虑交叉编译可以产生的问题,比如说这个东西如果用 shell
或者 perl
代替,就没有这种问题了。