基于Linux内核的应用程序构造(二)——应用程序编译

来源:互联网 发布:温和祛痘洗面奶知乎 编辑:程序博客网 时间:2024/06/05 06:48

依据oplonu产品为例,着重解析编译过程

Kernel Version:linux2.6.21.5

SDK:https://github.com/DavionKnight/oplonu


执行编译脚本$ ./f23p-v1e-build

执行make f23pv1e为内核配置见上个博文

执行make

一.分别编译apps和busybox

//oplonu/Makefile:

all: $(COMPONENTS)

$(COMPONENTS):
    @echo "=== make COMPONENT ./$@"
    @$(MAKE) -rw -C $@

//oplonu/Makefile.conf:

COMPONENTS = \
    apps \
    busybox

二.进入apps目录,编译opconn和pppoe两个app

# List of directories to make
SUBDIRS = \
    opconn \
    pppoe

# Define at least one rule before commonrules, otherwise the first commonrule will be the default.
# Here, default rule all: should be to build all SUBDIRS.
all: $(SUBDIRS)

//oplonu/Makefile.rules:

# Rule to make a subdirectory
$(SUBDIRS):
    @$(MAKE) -r -C $@


三.进入opconn目录,进行编译,最终生成opconn可执行文件

all: libdir $(COMPONENTS) image

//libdir主要创建build目录以存放编译结果

libdir:
    @if [ -d $(LIBDIR) ]; then \
        echo "Output directory is $(LIBDIR)."; \
    else \
        echo "Output directory $(LIBDIR) does not exists. Creating ..."; \
        mkdir $(LIBDIR); \
    fi

//编译生成各个库文件

$(COMPONENTS):
    @echo "=== make COMPONENT ./$@"
    @$(MAKE) -rw -C $@

其中COMPONENTS如下:

COMPONENTS = \
    bridge \
    cli \
    dvrs \
    hal \
    oamp \
    port \
    multicast \
    sys \
    vos \
    stats\
    rstp \
    qos \
    exchange \
    ipc    \
    run_led \
    uart_init    \
    trmsvr    \
    product    \
    gwdPlatform

进入各个目录下,Makefile如下

all: $(LIBDIR)/$(LIB)

//oplonu/Makefile.rules:

$(LIBDIR)/$(LIB): $(OBJECTS) Makefile
    @echo "--- Building library $(LIBDIR)/$(LIB) ---"
    @$(AR) -rsv $(LIBDIR)/$(LIB) $(OBJECTS);sleep 1

$(LIBDIR)/%.o: %.c Makefile
    @echo "--- $<    ->    $@"
    @$(CC) -W -c -x c $(OPTIMIZATION) $(CCFLAGS) $(LOCALINCLUDE) -o $@ $<

通过红色字体代码,生成对应的.a文件

//oplonu/Makefile.rules:

image: rmmain $(LIBDIR)/main.o
    @echo ""
    @echo "    +++ Building $(TARGET) image +++"
    @echo ""
    -@rm -f $(LIBDIR)/$(TARGET)
    @if [ -e $(LIBDIR)/$(TARGET) ]; then \
        echo "==============================================="; \
        echo "===  ERROR : $(TARGET) access denied        ==="; \
        echo "===  File is used by another process        ==="; \
        echo "===  check your debugger                    ==="; \
        echo "==============================================="; \
        return 1;\
    fi
    $(CC) $(OPTIMIZATION) $(CCFLAGS) $(LIBDIR)/main.o $(TARGETDIR)/linux/opl_modif.o -L$(LIBDIR) $(LIBS) \
    -o $(LIBDIR)/$(TARGET)
    @if [ $$? != 0 ]; then echo "NOT DONE. Terminated due to make error"; return 1; fi
    @echo ""
    @echo "    +++ Done. File is here: +++"
    @echo ""
    @echo "    $(LIBDIR)/$(TARGET)"
    @$(STRIP) --strip-debug --strip-unneeded --discard-all $(LIBDIR)/$(TARGET) -o $(LIBDIR)/$(TARGET).stripped

    @if command -v lzma &>/dev/null; \
    then \
        lzma e $(LIBDIR)/$(TARGET).stripped $(LIBDIR)/$(TARGET).img; \
#        lzma $(LIBDIR)/$(TARGET).stripped \
        rm -f $(LIBDIR)/$(TARGET).stripped; \
#        mv -f $(LIBDIR)/$(TARGET).stripped.lzma $(LIBDIR)/$(TARGET).img; \
        echo ""; \
    else \
        gzip -9 $(LIBDIR)/$(TARGET).stripped; \
        mv -f $(LIBDIR)/$(TARGET).stripped.gz $(LIBDIR)/$(TARGET).img; \
    fi
    @if [ -e $(LIBDIR)/$(TARGET).img ]; then \
        echo "    $(LIBDIR)/$(TARGET).img"; \
    fi
    @echo ""

命令image 编译main.c并链接所有静态库文件生成最后的可执行文件opconn

并通过lzma压缩,生成opconn.img文件






0 0
原创粉丝点击