Concepts of Makefile

這件事是這樣的:

我的 module 要在 Linux x86_64 上 complier ,且能夠在 OpenWrt arm64 上執行。

另一方面,我的 lib 會引用到其他的 lib。

所以我會遇到幾個問題:

  1. Cross complier 是什麼?什麼時候需要它?如何設定?

  2. 如何引用別人的模組

  3. 在 C++ 程式呼叫 C 語言的函式

—————————————————–

為了解決這問題,我們要先知道幾件事:

  • 認識編譯流程

  • 認識編譯目標

  • 如何寫 Makefile 並且 build 成 Library

  • Makefile 的參數,特別是 Link 相關 => 於下篇介紹

認識編譯流程

Step 1: 我們寫好的程式:*.c Step 2: 形成機器看的:*.o Step 3: 連結(Link) 成我們的目標

認識編譯目標

1. 執行檔:需在程式裡面有進入點 — main 2. 動態函式庫: *.so,這種函式庫的特徵在於:需要使用時才載入 這種函式庫的特徵在於:需要使用時才透過 dlopen 載入,之後使用 dlsym 取得函式 3. 靜態函式庫: *.a,這種函式庫的特徵在於:一開始就 build 成一包 lib 所以整個 lib 檔案會很大

如何寫 Makefile 並且 build 成 “執行檔”

#寫下你最後要產生的東西:執行檔? .a? .so? .o? .s?
#這邊是定義 target 叫做什麼
TARGET=AAA
#寫下編譯出來的 .o 叫什麼
SRC_OBJS := $(addsuffix .o, $(TARGET))
#寫下你會用到的 header
SRC_HEADERS = \
../../include/AAA.h \
../../include/aaa.h

#開始 make all 的動作,也就是要產生 AAA 這個執行檔
all: $(TARGET)

#這意思是:要 build 出 $(TARGET) (在這裡是 AAA)
# 需要 $(SRC_OBJS) (在這裡是 AAA.o)
$(TARGET): $(SRC_OBJS)

# Compile c source file
#這意思是:要 build 出 %.o (在這裡是 AAA.o) 需要 AAA.c, AAA.h, 和 aaa.h
%.o: %.c $(SRC_HEADERS)

# Other Targets
clean:
	-$(RM) *.o
	-$(RM) $(TARGET)
	-@echo ' '
#偽目標
.PHONY: all clean

build 成 Library 需要有其他參數,待下篇介紹參數如何寫。

來回答原本的問題:

  • Cross complier 是什麼?什麼時候需要它?如何設定?

=> 當你在編譯平台與執行平台不同時,就會需要它

e.g. Linux x86_64 上編譯 ,且要在 OpenWrt arm64 上執行

  • 如何引用別人的模組

=> 1. 在你的程式裡面,加上要引用的 lib 對應到的 header

2. 在 makefile 的 Link 的地方,指向要引用的 lib (可以是 .a, .so 看你的需求)

  • 在 C++ 程式呼叫 C 語言的函式

=> 這問題會跟 scope 有關,會跟 extern 一起介紹

ref. https://blog.gtwang.org/programming/howto-create-library-using-gcc/

Last updated