五、排查符号表问题
我们现在编译已经可以通过了,但实际上APP未必能运行。这是因为SylixOS作为嵌入式操作系统,APP采用的是交叉编译的方式,即编译环境与运行环境是完全两套场景。这意味着,编译器在编译的时候,并不能确定某些符号,在运行环境中是否存在,所以不能报错,最多只会产生编译告警。而实际上只要声明了那些函数或变量,连告警都不会产生。
实际能不能运行,只能上传到SylixOS环境中验证。先把要上传的文件添加到Device Settings里:
因为我们的liblua都是以静态库的形式链接进app的,所以不需要再上传。将libhiredis.so上传到/lib目录下,其他传到/apps/redis下。这里我是用模拟器作为运行环境,模拟器的使用和配置方式,参考《RealEvo-Simulator使用手册.pdf》,这里就不再赘述了。
先从简单的来,尝试 ./redis-cli 运行client,发现报了一个找不到的符号表:
遇到这种问题,一般先搜索本工程(redis),确认一下这个符号是工程内实现的,还是base里实现的。找到使用的位置,按住ctrl+鼠标左键追踪一下,发现是base里实现的,实现的位置在libcextern的目录里,说明此符号是通过SylixOS的额外C库实现的,即函数实现在libcextern.so中,所以需要在APP的makefile里指定链接libcextern.so。
实际上redis-server里一样有这个问题,修改一下makefile:redis-cli.mk redis-server.mk
这样改完需要rebuild工程才有效,rebuild以后再上传。尝试运行一下redis-cli:
这说明APP已经可以运行了,先放一边,继续验证redis-server:
发现redis-server也已经可以运行了(server打印的时间还有问题),那运行着server,看看redis-cli能不能连接上server:
发现cli可以连上server,但貌似存在什么莫名其妙的问题,并没有响应我的命令,而且换行也很奇怪。
没事,起码移植的前两步已经完成了,开始慢慢的测和查吧。
评论