Concepts of Makefile
這件事是這樣的:
我的 module 要在 Linux x86_64 上 complier ,且能夠在 OpenWrt arm64 上執行。
另一方面,我的 lib 會引用到其他的 lib。
所以我會遇到幾個問題:
  1. 1.
    Cross complier 是什麼?什麼時候需要它?如何設定?
  2. 2.
    如何引用別人的模組
  3. 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 成 “執行檔”

1
#寫下你最後要產生的東西:執行檔? .a? .so? .o? .s?
2
#這邊是定義 target 叫做什麼
3
TARGET=AAA
4
#寫下編譯出來的 .o 叫什麼
5
SRC_OBJS := $(addsuffix .o, $(TARGET))
6
#寫下你會用到的 header
7
SRC_HEADERS = \
8
../../include/AAA.h \
9
../../include/aaa.h
10
​
11
#開始 make all 的動作,也就是要產生 AAA 這個執行檔
12
all: $(TARGET)
13
​
14
#這意思是:要 build 出 $(TARGET) (在這裡是 AAA)
15
# 需要 $(SRC_OBJS) (在這裡是 AAA.o)
16
$(TARGET): $(SRC_OBJS)
17
​
18
# Compile c source file
19
#這意思是:要 build 出 %.o (在這裡是 AAA.o) 需要 AAA.c, AAA.h, 和 aaa.h
20
%.o: %.c $(SRC_HEADERS)
21
​
22
# Other Targets
23
clean:
24
-$(RM) *.o
25
-$(RM) $(TARGET)
27
#偽目標
28
.PHONY: all clean
Copied!

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

來回答原本的問題:

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