基于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 $@
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文件
- 基于Linux内核的应用程序构造(二)——应用程序编译
- 基于Linux内核的应用程序构造(一)——内核配置
- 基于Linux内核的应用程序构造(三)——内核安装
- Linux内核启动应用程序分析(二)
- 内核态下基于动态感染技术的应用程序执行保护(二 使用汇编语言编写内核态程序)
- 内核态下基于动态感染技术的应用程序执行保护(二 使用汇编语言编写内核态程序)
- 应用程序调试(三)————配置内核输出应用程序的段错误信息
- 基于Ajax的应用程序架构汇总(二)
- 基于Ajax的应用程序架构汇总(二)
- Linux内核模块与应用程序的对比
- linux内核模块和应用程序的区别
- Linux下应用程序编译
- Linux内核启动应用程序分析(一)
- Linux内核启动应用程序分析(三)
- 基于ARM的嵌入式Linux应用程序开发
- 基于ARM的嵌入式Linux应用程序开发
- 基于ARM的嵌入式Linux应用程序开发
- Linux环境编译OpenCV的应用程序方法
- sql中的DML与DDL
- MATLAB报错:MTIMES is not fully supported for integer classes. At least one input must be scalar.
- spark on yarn运行产生缺jar包错误及解决办法
- Windows下各种类型的守护进程的写法
- Fund Management - POJ 3570 dp
- 基于Linux内核的应用程序构造(二)——应用程序编译
- 机器翻译(待续)
- ERROR: Can't get master address from ZooKeeper; znode data == null
- 求取圆内整数点(格点)的算法
- Android Animation 基础介绍 和例子
- Maven基础——实战篇
- ArrayList对对象中某属性排序
- SAP LSMW(摘自官网)
- [LeetCode]Best Time to Buy and Sell Stock II