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