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 檔案會很大
#寫下你最後要產生的東西:執行檔? .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
- Cross complier 是什麼?什麼時候需要它?如何設定?
=> 當你在編譯平台與執行平台不同時,就會需要它
e.g. Linux x86_64 上編譯 ,且要在 OpenWrt arm64 上執行
- 如何引用別人的模組
=> 1. 在你的程式裡面,加上要引用的 lib 對應到的 header
2. 在 makefile 的 Link 的地方,指向要引用的 lib (可以是 .a, .so 看你的需求)
- 在 C++ 程式呼叫 C 語言的函式
=> 這問題會跟 scope 有關,會跟 extern 一起介紹