编译某基于OpenWrt的系统的问题记录


为Lindenis v536编译Tina Linux, 厂家提供的环境是在Ubuntu14.04的虚拟机上编译的, 时间大概在2017年左右
现在已经2021年了, 而且我用的是wsl的Ubuntu20.04, 有很多地方需要修改才能通过编译

1. Please port gnulib freadahead.c to your platform! Look at the definition of fflush, fread, ungetc on your system, then report this to bug-gnulib.
Please port gnulib fseterr.c to your platform! Look at the definitions of ferror and clearerr on your system, then report this to bug-gnulib.
解决方案:
进入报错文件所在目录, 输入以下命令(自己看着改)

sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.c
echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h

原因分析:
系统中的gnulib太新, 新版的gnulib把IO_ftrylockfile改为了IO_EOF_SEEN并且把_IO_IN_BACKUP隐藏了起来

2. 编译u-boot-2018.03时出错error: conflicting types for ‘__u64’
././include/compiler.h:69:18: note: previous declaration of ‘__u64’ was here
解决方案:
修改u-boot-2018.03/include/compiler.h, 把第69行定义的__u64注释掉

3. major或minor或makedev未定义
解决方案:
#include <sys/sysmacros.h>
或者我发现这些文件里都包含了sys/types.h
也许可以修改/usr/include/sys/types.h, 向里面加入#include <sys/sysmacros.h>

4. errnos_msgidxof未定义
解决方案:
libgpg-error-1.33/src/Makefile
libgpg-error-1.33/src/Makefile.am
libgpg-error-1.33/src/Makefile.in
libgpg-error-1.33/src/mkstrtable.awk
将“namespace”替换为“pkg_namespace”

5. test/test_regress-regress_ssl.o: In function ‘ssl_getcert’:
regress_ssl.c:(.text+0x12c0): undefined reference to ‘X509_get_notBefore’
regress_ssl.c:(.text+0x12e0): undefined reference to ‘X509_get_notAfter’
test/test_regress-regress_ssl.o: In function ‘regress_bufferevent_openssl’:
regress_ssl.c:(.text+0x20f0): undefined reference to ‘SSLeay’
regress_ssl.c:(.text+0x2100): undefined reference to ‘SSLeay’
collect2: error: ld returned 1 exit status
make[5]: *** [Makefile:1520: test/regress] Error 1
make[5]: Leaving directory ‘*****/openwrt/out/v536-Lindenis_SBC/compile_dir/target/libevent-2.1.8-stable’
解决方案:
进入libevent的文件夹
将X509_get_notBefore替换为X509_getm_notBefore
将X509_get_notAfter替换为X509_getm_notAfter
将SSLeay替换为OpenSSL_version_num

6. 找不到Allwinner/libcedarx的选项或cedarx库编译失败
因为我的SDK可能比较旧, 还没有适配V536, 需要在package/allwinner/tina_multimedia/Makefile中自行加入v536相关配置
然后好像还需要在package/allwinner/tina_multimedia/tplayer/configs下新增一个配置文件(如果使用了tplayer的话)
2022/2/12补充:
我发现package/allwinner/liballwinner_tina好像也没适配V536, 这个似乎是旧版的库, 已经没有用了

7. 找不到CdxList.i
把softwinner/eyesee-mpp/middleware/v316/media/LIBRARY/libcedarx/libcore/base/include/CdxList.i复制到out/v536-Lindenis_SBC/compile_dir/target/libcedarx/libcedarx/libcore/base/include/里

cp softwinner/eyesee-mpp/middleware/v316/media/LIBRARY/libcedarx/libcore/base/include/CdxList.i out/v536-Lindenis_SBC/compile_dir/target/libcedarx/libcedarx/libcore/base/include/

原因分析:
他似乎是忘了复制.i文件了, 但是我懒得改他的Makefile, 就这样吧

8. MPP和例程所在位置
这家公司真的是, 啥资料也没有, 全志的文档也啥都没写, 最终还是掘地三尺找到的…
首先需要按照第6步所示编译libcedarx, 然后进入menuconfig的Allwinner/eyesee-mpp把该选中的都选中
mpp位于softwinner/eyesee-mpp/middleware/v316目录下, 例程位于mpp的sample目录下
但是例程默认是没有编译的, 需要将tina.mk中你想要编译的例程取消注释
改完后进入package/allwinner/eyesee-mpp/middleware目录, 执行mm即可编译, 编译好的例程在各个例程的目录里, 并没有打包到镜像中
PS: ve, vencoder/libcodec/build.mk, vdecoder/videoengine, vdecoder/videoengine/h264, vdecoder/videoengine/h265, vdecoder/videoengine/mjpegplus这几个库在modules.mk和media/LIBRARY/libcedarc/tina.mk中被注释掉了, 注释掉的原因是已经预先编译好放在media/LIBRARY/libcedarc/library里了, 另外ve好像没有源代码

9. *****/openwrt/out/v536-Lindenis_SBC/staging_dir/target/usr/include/eyesee-mpp/middleware/include/utils/plat_defines.h:29:6: error: #error AWCHIP define may be error
#error AWCHIP define may be error
^~~~~
把plat_defines.h中报错的这行注释掉就行, 至于AWCHIP到底是选V5还是V316, 我都试了, 好像没啥区别…

10. *****/openwrt/out/v536-Lindenis_SBC/staging_dir/target/usr/include/eyesee-mpp/middleware/include/media/mm_comm_vi.h:375:5: error: unknown type name ‘bool’
bool use_custom_kmat;
^~~~
在mm_comm_vi.h中加上#include <stdbool.h>就行了

11. 找不到video_set_vin_reset_time函数
这个问题应该和Allwinner/eyesee-mpp的编译选项中的编译动态库和静态库的开关有关
video_set_vin_reset_time在softwinner/eyesee-mpp/middleware/v316/media/LIBRARY/libisp/isp_dev/video.c中
libISP中由好几个子项目组成, 如果没开启编译动态库就会把子项目编译成静态库, 最后编译到libISP.so中, 而如果开启了就会把每个子项目都编译成.so, 再单独编译libISP.so

我是在链接libmpp_vi的时候无法找到此函数的, 阅读其Makefile可知, 编译mpp_vi时只链接了libisp, 没有判断是否编译动态库再导入其它子项目的动态库
经过查找, libmpp_vi链接的libISP位于out/v536-Lindenis_SBC/staging_dir/target/usr/lib/libISP.so
暂时先用板子上正常的libISP替换掉这个文件作为临时解决方案, 真正的解决办法以后有时间再说

12. 链接libmedia_mpp.so时找不到VideoDecoderSetFreq函数
这个问题很奇怪, 这个函数的定义在vdecoder里, 明明是有的, 但就是找不到
所以我把调用这个函数的地方注释掉了, 在softwinner/eyesee-mpp/middleware/v316/media/component/VideoDec_Component.c里, 反正我也用不上vdec, 注释掉应该没事吧
我可真机智(bushi

参考: http://blog.chinaunix.net/uid-20680966-id-5833778.html
https://blog.csdn.net/wb4916/article/details/104448149
https://www.jianshu.com/p/d425a79cfd84

标题: 编译某基于OpenWrt的系统的问题记录
作者: QingChenW
链接: https://dawncraft.cc/2021/10/266/
本文遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 许可
禁止商用, 非商业转载请注明作者及来源!
上一篇
下一篇
隐藏