用户编程

我们提供了一些最简单而基础的库,可以在此基础上开发一些简单的应用程序。

程序库

描述
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.alibsconf.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标志
Copyright © BookOS-developers 2021 all right reserved,powered by Gitbook修订时间: 2021-06-16

results matching ""

    No results matching ""