LINUX平台下编译与运行程序
1.编译应用程序
应用程序编译注意有以下几点:
1.区分glibc和uclibc
对于复合编译器的相关选项会有不同。
比如:
CONFIG_UCLIBC_BUILD=y
ifeq ($(CONFIG_UCLIBC_BUILD), y)
CFLAGS += -muclibc
LDFLAG += -muclibc
endif
ifeq ($(CONFIG_UCLIBC_BUILD), y)
SDK_LIB_DIR = ../../lib/uclibc
else
SDK_LIB_DIR = ../../lib/glibc
endif
若是单独固定的版本,就没问题。
若是不清楚当前的工具链是什么类型的,可以使用gcc -v
命令进行查看。
具体可看这篇文章 https://www.cnblogs.com/hanyli/p/15466198.html
2.库的连接顺序
若库有先后连接顺序,写makefile时要注意。
比如 API 库的链接顺序: 先[libimp]后[libalog]
makefile中则需要这样写
LIBS := $(SDK_LIB_DIR)/libimp.a $(SDK_LIB_DIR)/libalog.a
3.库有用到C++库
需要使用 mips-linux-gnu-g++
进行链接,
或使用 gcc 链接,需要手动添加 LD_FLAGS+=stdc++
4.如何优化 elf 文件的大小:
A. 编译等级选择O2:C_FLAGS/CXX_FLAGS += -O2
B. 不链接不必要的段。
CCFLAGS += -ffunction-sections -fdata-sections
LDFLAGS += -Wl,--gc-sections
C. 链接后删除不必要的段。
方法:
STRIP = $(CROSS_COMPILE)strip
$(TARGET): $(target_deps) | $(objdir) $(dumpdir)
$(Q)echo "GEN $(TARGET)"
$(Q)$(CROSS_COMPILE)gcc $(target_deps) -o $@ $(LDFLAGS) $(LIBS)
$(Q)$(STRIP) $@
结果对比
#strip 之前
-rwxrwxr-x 1 hany hany 681K Nov 24 20:27 out/diamond
#strip 之后
-rwxrwxr-x 1 hany hany 176K Nov 24 20:27 out/diamond
5.使用动态库还是静态库
若系统中有多个 elf 文件需要链接库文件,可使用动态链接的方式。
若只有一个文件链接库文件,请使用静态链接的方式。
在调试时选择动态链接的方式可以方便的进行 debug 及 问题反馈。
2. 运行应用程序
- 通常将应用程序放到
/bin
目录里, - 库文件放到
/lib
目录里, - 配置文件 则放到
/etc
目录里。 - 制作包含新应用程序的根文件系统。
注意:如果执行应用程序,需要读写文件系统操作。请选择 squashfs、jffs2 文件系统。
如果需要系统启动后自动运行,请在编写文件系统 时,编辑/etc/init.d/rcS 文件,添加需要启动的应用程序路径。