LINUX平臺下編譯與執行程式
阿新 • • 發佈:2021-11-24
目錄
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 檔案,新增需要啟動的應用程式路徑。