1. 程式人生 > 其它 >LINUX平臺下編譯與執行程式

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 檔案,新增需要啟動的應用程式路徑。