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 文件,添加需要启动的应用程序路径。

posted @ 2021-11-24 20:39  海林的菜园子  阅读(392)  评论(0编辑  收藏  举报