SylixOS 应用移植指导——以Redis5.0.3为例(三)

tc666
tc666
tc666
8
文章
1
评论
2021年7月2日17:19:10 评论 955

二、创建IDE工程

总结一下本阶段的工作:

已知:

  1. Redis源码
  2. Redis编译流程
  3. 需要编译的依赖库
  4. 需要编译出的目标文件

目标:

  1. 在SylixOS IDE下构建工程
  2. 配置与Linux下一致的编译流程
  3. 编译出所有依赖的库
  4. 编译出最终的可执行文件

SylixOS IDE 工程

在把Linux工程代码贴入IDE工程之前,首先需要了解一下SylixOS的工程结构和Makefile规则。

首先我们创建一个专家模式的APP工程,关于专家模式与普通模式的区别,可以参考《RealEvo-IDE使用手册.pdf》,总结一下就是:专家模式所有的配置通过修改Makefile来实现,普通模式所有的配置通过图形化勾选来实现,这两种模式不要混用,否则可能出现在Makefile里改了内容但编译一下内容消失的“惨案”。

SylixOS 应用移植指导——以Redis5.0.3为例(三)

刚创建的工程一般有以下几个文件:

SylixOS 应用移植指导——以Redis5.0.3为例(三)

简单介绍一下几个文件:

src目录:

一般工程源码直接贴入此目录,默认会创建一个和工程同名的.c文件,可删除。

config.mk:

指定工程依赖的BASE路径,以及工程的debug level是Debug还是Release,一般不需要改动。

Makefile:

SylixOS工程的Makefile文件,里面大部分都是include各种模板,其中用户唯一需要关心的就是“Include targets makefiles”部分:SylixOS 应用移植指导——以Redis5.0.3为例(三)

这里include的就是实际工程需要编译的app或者库的makefile文件了,默认只include工程同名的mk文件。而随着移植的进展,可能会有libA.mk,libB.mk、C.mk、D.mk等等,需要在此位置分别include进来,否则编译器不会编译。

redis.mk:

这里是redis.mk,是因为我工程名字叫redis,所以自动生成的。这个mk下的宏分别对应的内容为:

LOCAL_TARGET_NAME:

生成的目标名称,一般生成动态库A的名称格式是“LOCAL_TARGET_NAME := libA.aso”,生成静态库A名称的格式是“LOCAL_TARGET_NAME := libA.a”,生成可执行文件A的名称格式就是 “LOCAL_TARGET_NAME := A”。需要注意的是,这里的名称并不会让编译器按照APP或动态库的模板去编译,所以不要认为你改了target_name编译器就直接帮你编动态库了,实际是有地方指定的,下面会说。

LOCAL_SRCS :

这里指定编译的所有源文件。

LOCAL_INC_PATH :

这里指定编译的头文件路径,注意,有时候头文件是有先后顺序之分的,最好的办法就是直接参考Linux编译流程。

LOCAL_DSYMBOL :

这里指定的是编译的宏或者符号,也就是-Da=xxx,相当于.c里写了#define a xxx。属于GCC的语法,所以一样可以参考Linux下的编译流程。

LOCAL_CFLAGS :
LOCAL_CXXFLAGS :

分别是gcc和g++的编译参数。

LOCAL_DEPEND_LIB :
LOCAL_DEPEND_LIB_PATH:

指定工程的依赖库和依赖库路径,这里的路径指的是IDE下的库路径,即Windows下的路径,不是SylixOS运行环境下的库路径。依赖SylixOS Base的libcextern库的写法为:

LOCAL_DEPEND_LIB      := \
-lcextern
LOCAL_DEPEND_LIB_PATH := \
-L"$(SYLIXOS_BASE_PATH)/libcextern/$(Output)"
LOCAL_USE_CXX :
LOCAL_USE_CXX_EXCEPT :

是否使能C++,是否使用C++异常库,如果是C++工程就=yes。

LOCAL_NO_UNDEF_SYM、LOCAL_USE_GCOV、LOCAL_USE_OMP:

基本用不到,感兴趣可以自己研究。

LOCAL_PRE_LINK_CMD、LOCAL_POST_LINK_CMD、LOCAL_PRE_STRIP_CMD、LOCAL_POST_STRIP_CMD:

对应link阶段或strip阶段执行的命令,一般用不到,巧的是redis还真用到了。

include $(APPLICATION_MK)

这个很重要,一般位于.mk的最后面,指定本mk使用哪一套模板,APP就是APPLICATION_MK,动态库/静态库是LIBRARY_MK。这里指定了本工程的最终属性。

 

了解了IDE的工程属性以及Makefile模板规则,可以贴入代码了。先残忍了删了自带的redis.c,然后将linux下的工程源码拖到工程下,我一般推荐是configure过后的文件贴过来,而不是拿tar.gz直接解压的,因为configure一般会生成config.h,并做过第一遍的修改。当然由于redis没有configure,区别倒不是太大:

SylixOS 应用移植指导——以Redis5.0.3为例(三)

当然,可以把无关文件清掉,这点就看各人喜好了。

tc666
  • 本文由 发表于 2021年7月2日17:19:10
  • 转载请务必保留本文链接:http://www.databusworld.cn/10345.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: