Embedded System 修課紀錄(1)
第三堂課助教所上的課程核心是 Toolchain,而不同於上禮拜的平台,今天是在 Linux Ubuntu 8.04 系統上面進行的教學。
Autotools
Autotool 是一套 GNU project 提供用來包裝 Source Code的工具。GNU Compiler Collection(GCC) 它支援許多語言和不同處理器的編譯處理,因此也是最多人常使用的一個工具集。
準備要編譯的檔案目錄架構
目標
用automake產生Makefile,其 lib_add, 要compile成dynamic library 且 lib_mul 要compile成static library
操作流程
INCLUDES=-I../include 等同於 INCLUDES=-I$(top_srcdir)/include
標色為可自行命名的地方。
標色為可自行命名的地方。
將程式運行會編譯到的連結庫之目錄寫上即可。若想要該換產生出來的執行檔名稱,可以更改 bin_PROGRAMS 參數為你想要的,例如: abc。因此,連帶的 abc_SOURCES, abc_LDADD 等等對應的部分要做修正
如果編譯的過程發生錯誤,或是有任何要更新的地方。只要把東西或是文件補齊,從 aclocal 指令往下實作即可,不用重新 autoscan 和編寫修改 configure.scan
確認執行結果
以上大致是本次實驗課學習的 Autotools on Linux 過程,另外,還有本次實驗加分題( build toolchain )的練習,是一個利用其他函式去編譯到給特定平台的組譯碼,這部分未來寫完專案燒板子也會用到。
延伸學習
Reference
[1.] GNU Autotools 初探 & share library 的蠢事
[2.] 陳雍穆, Automake 入門文件
Autotools
Autotool 是一套 GNU project 提供用來包裝 Source Code的工具。GNU Compiler Collection(GCC) 它支援許多語言和不同處理器的編譯處理,因此也是最多人常使用的一個工具集。
準備要編譯的檔案目錄架構
// test drwxrwxrwx 2 sn sn 4096 2011-03-08 16:18 include drwxrwxrwx 4 sn sn 4096 2011-03-14 02:41 lib_add drwxrwxrwx 3 sn sn 4096 2011-03-14 02:42 lib_mul -rw-r--r-- 1 sn sn 29 2011-03-14 02:31 Makefile.am drwxrwxrwx 4 sn sn 4096 2011-03-14 02:42 src // include -rwxrwxrwx 1 sn sn 98 2010-04-07 23:57 test.h // lib_add -rwxrwxrwx 1 sn sn 74 2010-04-07 23:56 ad.c -rwxrwxrwx 1 sn sn 58 2010-04-07 23:57 d.c -rw-r--r-- 1 sn sn 90 2011-03-14 02:30 Makefile.am // lib_mul -rw-r--r-- 1 sn sn 71 2011-03-14 02:30 Makefile.am -rwxrwxrwx 1 sn sn 62 2010-04-07 23:58 mul.c // src -rwxrwxrwx 1 sn sn 63 2010-04-07 23:59 main.c -rw-r--r-- 1 sn sn 174 2011-03-14 02:35 Makefile.am
目標
用automake產生Makefile,其 lib_add, 要compile成dynamic library 且 lib_mul 要compile成static library
操作流程
- 編寫 Makefile.am
// 靜態連結編譯 // path: ./lib_mul noinst_LIBRARIES=libmul.a libmul_a_SOURCES=mul.c INCLUDES=-I../include
INCLUDES=-I../include 等同於 INCLUDES=-I$(top_srcdir)/include
標色為可自行命名的地方。
// 動態連結編譯 // path: ./lib_add lib_LTLIBRARIES=libhello.la libhello_la_SOURCES=ad.c d.c INCLUDES=-I$(top_srcdir)/include
標色為可自行命名的地方。
// 主程式存在的目錄 // path: ./src AUTOMAKE_OPTIONS = foreign INCLUDES=-I../include bin_PROGRAMS= main main_SOURCES= main.c // 靜態連結 main_LDADD= ../lib_mul/libmul.a // 動態連結 LIBS = -lhello main_LDFLAGS= -L$(top_srcdir)/lib_add // 專案資料夾 // path: ./ SUBDIRS= lib_mul lib_add src
將程式運行會編譯到的連結庫之目錄寫上即可。若想要該換產生出來的執行檔名稱,可以更改 bin_PROGRAMS 參數為你想要的,例如: abc。因此,連帶的 abc_SOURCES, abc_LDADD 等等對應的部分要做修正
- 執行 autoscan
- 編輯 configure.scan 並另存 configure.in
// 註解 #AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS) #AC_CONFIG_HEADER([config.h]) // 新增 AC_INIT(main, 1.0) AM_INIT_AUTOMAKE // 在 # Checks for libraries. 之後新增 AC_PROG_LIBTOOL
- 執行 aclocal
- 執行 autoconf
- 產生 GNU 套件都必備的四項文件
touch README NEWS AUTHORS ChangeLog
- 執行 libtoolize 以及 執行編譯 GNU 套件所缺乏的資源
// --force 參數是強制寫覆蓋 // 第一次執行此指令可以省略
// 建立 shared library 之用 libtoolize -- force // 產生 Makefile.in automake --add-missing
產生 Makefile.in 它是最終編譯 Makefile 的範本
- 接著是 Tarball 安裝三部曲
./configure --prefix=/home/sn/lab2_project/ make make install
如果編譯的過程發生錯誤,或是有任何要更新的地方。只要把東西或是文件補齊,從 aclocal 指令往下實作即可,不用重新 autoscan 和編寫修改 configure.scan
確認執行結果
# ./main add mul
以上大致是本次實驗課學習的 Autotools on Linux 過程,另外,還有本次實驗加分題( build toolchain )的練習,是一個利用其他函式去編譯到給特定平台的組譯碼,這部分未來寫完專案燒板子也會用到。
延伸學習
- 如何利用 GCC 指令編譯程式
- 撰寫 Makefile 語言
Reference
[1.] GNU Autotools 初探 & share library 的蠢事
[2.] 陳雍穆, Automake 入門文件
Comments
Post a Comment