1. Compiler
Compiler hay còn gọi là trình biên dịch có thể được hiểu là công việc dịch chuỗi câu lệnh được viết từ một ngôn ngữ lập trình thành chương trình tương đương dưới dạng ngôn ngữ máy tính, thường là ngôn ngữ ở cấp thấp hơn, ngôn ngữ máy. Đơn giản dễ hiểu thì có thể tạm nói là nhờ Complier này mà file .c chúng ta viết mới được dịch thành file .hex .bin để nạp được xuống một MCU bất kỳ.
Cross Compiler hay còn gọi là Toolchain có thể được hiểu là một source code được viết trên máy tính chạy trên chip Intel, sau khi thông qua một cross compiler sẽ cho ra file nhị phân có khả năng chạy được trên một nền tảng chip khác là ARM. Một ví dụ cơ bản nhất là mình đã dùng một máy tính hệ điều hành Ubuntu để build ra một file image có thể chạy trên Raspberry Pi
Binutils: Là một tập các công cụ để tạo và quản lý file nhị phân (bin) của target CPU
Thông thường để cross-compiler một chương trình ta phải cài đặt biến môi trường mới có thể compile đúng được
Ví dụ
export PATH=/path/to/compiler/bin:$PATH #đường dẫn đến thư mục chứa as, ld, ...
export CROSS_COMPILE=arm-none-linux-gnueabi-
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export CPP=${CROSS_COMPILE}cpp
export AR=${CROSS_COMPILE}ar
export AS=${CROSS_COMPILE}as
export LD=${CROSS_COMPILE}ld
export RANLIB=${CROSS_COMPILE}ranlib
export STRIP=${CROSS_COMPILE}strip
1.1 GCC
VD chạy GCC cho file c có tên main.c
export CFLAGS="-I./include -DDEBUG -Wall -g"
export LDFLAGS+=" -L./lib -lm"
gcc -c main.c ${CFLAGS} #tạo file object từ source
gcc -o prog main.o ${LDFLAGS} #tạo file chương trình nhị phân từ file object
./prog #chạy chương trình
CFLAGS
C compiler flags đưa các options vào trong compiler để thực hiện quá trình compile source code thành object sẽ bao gồm các thông tin:
export CFLAGS="-I./include -DDEBUG -Wall -g"
LDFLAGS
Linker flags dùng trong quá trình linking các thư viện, nó bao gồm các thông tin:
export LDFLAGS+=" -L./lib -lm"
gcc : Complier cho C source và g++ là complier cho C++ source
2.Makefile
Makefile là một file dạng script chứa các thông tin:
Lệnh make sẽ đọc nội dung Makefile, hiểu kiến trúc của project và thực thi các lệnh
Các ký hiệu makefile
Ví dụ, hãy xem xét khai báo sau:
all: library.cpp main.cpp
Trong trường hợp này:
$@
ước tính thành all
, các thành phần bên trái dấu :
$<
ước tính thành library.cpp
, thành phần đầu tiên bên phsir dấu :
$^
ước tính thành library.cpp main.cpp
, tất cả các thành phần bên trái :
.o
, %.c là tất cả file .c
Ký hiêu xuống hàng là \
bien = hello.h\
an.h
thì giá trị biên se gồm hello.h và an.h
Gán giá trị cho biến
1. Variable = value and Variable := value
2. Variable ?= value nếu biến chưa có giá trị thì gán
3. Variable += value
makefile có rules không rõ ràng: khi tạo file.o ta cần khai báo file.c,file.h.. cái nãy quá rõ ràng. Để rút gọn ta chỉ cần khai báo file.h và bỏ luôn các rule
VD file khai báo rõ ràng
file.o:file.c file.h
gcc -c file.c
ta chuyển thành file.o:file.h
thì makefile vẫn hiểu được và thực thi
Ví dụ ta có một loạt các file :
My.c include các file sum.h addition.h substraction.h My.h
sum.c include các file sum.h addition.h
addition.c include các file sum.h addition.h
substraction.h include các file sum.h substraction.h
Thì khai báo makefile
OBJS = sum.o my.o addition.o substraction.o
$(OBJS):sum.h
My.o sum.o addtion.o : addition.h
my.o subtraction.o : subtraction.h
my.o : my.h