用户编程
我们提供了一些最简单而基础的库,可以在此基础上开发一些简单的应用程序。
程序库
库 | 描述 |
---|---|
xcrt | crt库,独立出来的c runtime接口 |
xlibc | xbook2 libc标准c库 |
pthread | xbook2支持的pthread线程库 |
sconf | simple config 简单配置文件库 |
xlibcpp | xbook2 libc标准cpp库 |
uview | 内核view图形驱动用户态封装的库 |
应用程序
ls程序解析
要开发应用程序,就需要在xbook2/bin
目录下面创建一个程序,然后在xbook2/bin/Makefile
中添加程序名。
MODULE += ls
然后在ls里面的Makefile(xbook2/bin/ls/Makefile)
中添加对应的c源文件和头文件,以及需要链接的库名。
X_LIBS += libxlibc.a # 添加库名lib+name+.a
NAME := ls # 程序编译后的名字
SRC += main.c # 需要编译的源程序
define CUSTOM_TARGET_CMD
echo [APP] $@; \
$(LD) $(X_LDFLAGS) $(X_OBJS) -o $@ $(patsubst %, -L%, $(X_LIBDIRS)) --start-group $(patsubst %, -l:%, $(X_LIBS)) --end-group; \
cp $@ $(srctree)/../develop/rom/bin
endef
如果要添加头文件就X_INCDIRS+=
头文件目录即可。例如X_INCDIRS+= ls/include
,注意这里需要加ls
再加include
。也就是程序目录名+程序头文件路径。
最后就是实现main.c
里面的代码来实现你的功能了,ls
的功能就是显示当前工作目录下面的文件名。
编写完成后,需要编译才行,这里可以在终端输入make user
,就能自动编译修改过的程序了。
编译好后,make run
在虚拟机中启动,就可以在xbook2
的/bin
目录下面看到ls这个程序。因为环境变量中有/bin
,所以你可以直接输入ls
来执行这个程序,于是就可以看到当前工作目录下面的文件了。
需要注意的是,+=
的意思是在原有的内容上面增加新内容,:=
的意思是当前的内容会替代前面的内容,这个是Makefile的知识。
bash程序解析
在看一个发杂点的程序bash,它的Makefile(xbook2/bin/bash/Makefile)
的内容如下:
X_LIBS += libxlibc.a libsconf.a
X_INCDIRS += bash/ bash/include bash/lib
Program = bash
Version = 5.1
Machine = x86
OS = bookos
VENDOR = pc
MACHTYPE = x86-pc-bookos
localedir = /usr/local
PACKAGE = bash
prefix = /usr/local
aliaspath = $(prefix)/data/locale
X_CFLAGS += -w -DPROGRAM='"$(Program)"' -DCONF_HOSTTYPE='"$(Machine)"'\
-DCONF_OSTYPE='"$(OS)"' -DCONF_MACHTYPE='"$(MACHTYPE)"' \
-DCONF_VENDOR='"$(VENDOR)"' -DLOCALEDIR='"$(localedir)"' -DPACKAGE='"$(PACKAGE)"' \
-DHAVE_CONFIG_H -DLIBDIR=\"$(prefix)/libdata\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \
-D__XBOOK__ -DIN_LIBINTL
NAME := bash
SRC += shell.c eval.c general.c make_cmd.c print_cmd.c y.tab.c \
dispose_cmd.c execute_cmd.c variables.c version.c \
expr.c copy_cmd.c flags.c subst.c hashcmd.c hashlib.c mailcheck.c \
test.c trap.c alias.c nojobs.c braces.c \
input.c bashhist.c array.c arrayfunc.c assoc.c sig.c pathexp.c \
unwind_prot.c siglist.c bashline.c bracecomp.c error.c \
list.c stringlib.c locale.c findcmd.c redir.c \
pcomplete.c pcomplib.c syntax.c xmalloc.c
SRC += builtins/*.c
SRC += lib/glob/glob.c
SRC += lib/glob/strmatch.c
SRC += lib/glob/smatch.c
SRC += lib/glob/xmbsrtowcs.c
SRC += lib/glob/gmisc.c
SRC += lib/tilde/tilde.c
SRC += lib/sh/*.c
SRC += lib/termcap/termcap.c
SRC += lib/termcap/tparm.c
SRC += lib/intl/bindtextdom.c
SRC += lib/intl/dcgettext.c
SRC += lib/intl/dgettext.c
SRC += lib/intl/gettext.c
SRC += lib/intl/finddomain.c
SRC += lib/intl/loadmsgcat.c
SRC += lib/intl/localealias.c
SRC += lib/intl/textdomain.c
SRC += lib/intl/l10nflist.c
SRC += lib/intl/explodename.c
SRC += lib/intl/dcigettext.c
SRC += lib/intl/dcngettext.c
SRC += lib/intl/dngettext.c
SRC += lib/intl/ngettext.c
SRC += lib/intl/plural.c
SRC += lib/intl/plural-exp.c
SRC += lib/intl/localcharset.c
SRC += lib/intl/relocatable.c
SRC += lib/intl/localename.c
SRC += lib/intl/log.c
SRC += lib/intl/osdep.c
SRC += lib/intl/intl-compat.c
SRC += lib/readline/readline.c lib/readline/funmap.c lib/readline/keymaps.c \
lib/readline/vi_mode.c lib/readline/parens.c lib/readline/rltty.c \
lib/readline/complete.c lib/readline/bind.c lib/readline/isearch.c \
lib/readline/display.c lib/readline/signals.c \
lib/readline/util.c lib/readline/kill.c \
lib/readline/undo.c lib/readline/macro.c lib/readline/input.c \
lib/readline/callback.c lib/readline/terminal.c \
lib/readline/history.c lib/readline/histsearch.c lib/readline/histexpand.c \
lib/readline/histfile.c lib/readline/nls.c lib/readline/search.c \
lib/readline/savestring.c \
lib/readline/text.c lib/readline/misc.c lib/readline/compat.c \
lib/readline/colors.c lib/readline/parse-colors.c \
lib/readline/mbutil.c
define CUSTOM_TARGET_CMD
echo [APP] $@; \
$(LD) $(X_LDFLAGS) $(X_OBJS) -o $@ $(patsubst %, -L%, $(X_LIBDIRS)) --start-group $(patsubst %, -l:%, $(X_LIBS)) --end-group; \
cp $@ $(srctree)/../develop/rom/bin
endef
可以看到用了2个库,是libxlibc.a
和libsconf.a
,头文件引入了bash/ bash/include bash/lib
,这样设置之后,就可以在程序中直接<xxx.h>
找到位于bash
目录下面的某个头文件了,不然编译器找不到的。
除此之外,还修改了编译的flags,在这里,bash额外增加了一些标志:
-w -DPROGRAM='"$(Program)"' -DCONF_HOSTTYPE='"$(Machine)"'\
-DCONF_OSTYPE='"$(OS)"' -DCONF_MACHTYPE='"$(MACHTYPE)"' \
-DCONF_VENDOR='"$(VENDOR)"' -DLOCALEDIR='"$(localedir)"' -DPACKAGE='"$(PACKAGE)"' \
-DHAVE_CONFIG_H -DLIBDIR=\"$(prefix)/libdata\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \
-D__XBOOK__ -DIN_LIBINTL
通常,我们需要在编译时增加一些额外的宏定义或者是参数什么,就可以通过X_CFLAGS += xxx
实现。
编译器标志
最后列出一些可修改的变量供参考:
# compiler's flags
X_ASFLAGS := # 汇编标志
X_CFLAGS := # C语言标志
X_CXXFLAGS := # cxx标志
X_LDFLAGS := # 链接器标志
X_LIBDIRS := # 库目录
X_LIBS := # 库名
X_DEFINES := # 定义一些宏
X_INCDIRS := # 设置头文件目录
X_INCS := # 导入头文件
X_CPPFLAGS := # cpp标志