Compiler là gì ? Cross Compiler là gì ? Nó có tương quan gì tới một khối hệ thống nhúng ? bản thân cùng tìm hiểu một số định nghĩa cơ bản trong bài này nhé.

Bạn đang xem: Compiler là gì

Compiler

Compiler hay nói một cách khác là trình biên dịch có thể được hiểu là các bước dịch chuỗi câu lệnh được viết tự một ngôn từ lập trình thành chương trình tương tự dưới dạng ngôn từ máy tính, thường là ngôn từ ở cấp thấp hơn, ngữ điệu máy. Đơn giản dễ nắm bắt thì có thể tạm nói là nhờ Complier này mà lại file .c chúng ta viết bắt đầu được dịch thành file .hex .bin nhằm nạp được xuống một MCU bất kỳ.

Quá trình biên dịch

*

Chúng ta có thể xem sơ đồ đưa ra tiết các bước từ Code/Build/Run làm việc hình sau

*

Thông thường xuyên nếu dùng chương trình để lập trình như Keil C chẳng hạn thì chỉ cần ấn một nút Build/Run chấm dứt là chúng ta chỉ vấn đề ngồi hóng và chương trình được hấp thụ trực tiếp vào chip luôn, dẫu vậy ẩn đằng sau những nút này là 1 loạt hoạt động theo công việc như hình trên.

Cross Compiler/ Toolchain là gì ?

Cross Compiler hay nói một cách khác là Toolchain rất có thể được hiểu là 1 source code được viết trên máy tính xách tay chạy trên chip Intel, sau thời điểm thông qua 1 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ông giống là ARM. Một lấy ví dụ cơ bạn dạng nhất là mình đã dùng một máy tính hệ điều hành quản lý Ubuntu nhằm build ra một file image có thể chạy bên trên Raspberry Pi

*

Qúa trình tạo ra và áp dụng cross compiler/ tool chain có liên quan tới 3 đối tượng

Build: khối hệ thống tạo ra tool chain, thường xuyên là các máy tính xách tay dùng chip Intel cùng hệ điều hành quản lý Linux hoặc WindowsHost: khối hệ thống chạy tool chain nhằm compile source code, host cũng tương tự build thường là các máy tính dùng cpu Intel cùng Windows hoặc Linux là hệ điều hành.Target: là hệ thống chạy chương trình do host tạo ra, thường xuyên target là các laptop nhúng cần sử dụng chip ARM, tuy vậy nó cũng có thể là một máy tính thông thường dùng cpu Intel.
*

Vậy các thành phần của Cross Compiler là gì ?

*
Binutils: là 1 tập các công cố để chế tạo ra và cai quản file nhị phân (bin) của target CPUas : là assembler, nó xuất hiện mã nhị phân (binary code) từ bỏ assembler source codeld : trình links (linker)ar, ranlib : có mặt file nén .a, sử dụng như là thư việnobjdump, readelf, size, nm, strings: so với file nhị phânstrip : để vứt bỏ những phần quá trong file nhị phân nhằm giảm kích thước của chúng

Thông thường nhằm cross-compiler một chương trình ta phải cài đặt biến môi trường mới hoàn toàn có thể compile đúng đượcVí dụ

$ export PATH=/path/to/compiler/bin:$PATH$ export CROSS_COMPILE=arm-none-linux-gnueabi- $ export CC=$CROSS_COMPILEgcc $ export CXX=$CROSS_COMPILEg++ $ export CPP=$CROSS_COMPILEcpp $ export AR=$CROSS_COMPILEar $ export AS=$CROSS_COMPILEas $ export LD=$CROSS_COMPILEld $ export RANLIB=$CROSS_COMPILEranlib $ export STRIP=$CROSS_COMPILEstrip C/C++ LibraryLibrary được dùng làm interface giữa applications cùng kernel, hỗ trợ các C API chuẩn chỉnh để dễ dàng phát triển ứng dụng. Một số trong những libb rất có thể kể đến như: glibc, uClibc, eglibc, dietlibc, newlib, …

*
Kernel headerCung cấp các API quan trọng cho Applications và C Library tiếp xúc với Kernel.
*
GCC compilergcc, c++, g++ : compilerTrình biên dịch trong hệ thống Linux, compile cho không ít ngôn ngữ cùng nhiều bản vẽ xây dựng CPU khác nhau như ARM, MIPS, PowerPC, SuperH, x86; tuy vậy mình chỉ kể đến ngôn từ C/C++ và phong cách thiết kế CPU là ARM với x86.GDB Debugger: Trình gỡ rối, giúp sức cho quá trình phát hiện tại lỗi khi develop application.

Xem thêm: Tập The Dục Giảm Mỡ Bụng Vào Thời Gian Nào

Ví dụ với GCC Compiler

Cài để GCC

Trước hết, mình thực hiện quá trình với GCC trên máy vi tính dùng Ubuntu nhé

Thực hiện kiểm tra version hiện bao gồm của gcc/g++ và cài đặt

$ gcc --version$ g++ --version$ sudo apt-get install gcc g++

Ví dụ

Xét một ví dụ như cơ bạn dạng với chương trình C tính căn bậc 2 của 4 như sau

#include #include int main(int argc, char **argv) double x; x = sqrt(4); printf("x = %f ", x); return 1; Để thực hiện thì họ lưu code trên dưới dạng file là main.c, tiếp đến thực hiện gõ lệnh command sau trên ubuntu

$ export CFLAGS="-I./include -DDEBUG -Wall -g" $ export LDFLAGS+=" -L./lib -lm" $ gcc -c main.c $CFLAGS #tạo tệp tin object từ bỏ source $ gcc -o prog main.o $LDFLAGS #tạo file công tác nhị phân từ file object $ ./prog #chạy chương trình

Kết quả

*

Giải thích

Trên đây là một format cơ phiên bản nhất của GCC

CFLAGSC compiler flags đưa các options vào vào compiler nhằm thực hiện quy trình compile source code thành object sẽ bao gồm các thông tin:

Đường dẫn những header bắt đầu với -I, lấy một ví dụ -I./includeCác define được bắt đầu với -D, lấy ví dụ như -DDEBUG để define DEBUGCác option đặc biệt khác của compiler như -g nhằm bật tác dụng debug gdb của gcc compiler, -wall nhằm trace các cảnh báo (warning) trong quá trình c

$ export CFLAGS="-I./include -DDEBUG -Wall -g"LDFLAGS

Linker flags cần sử dụng trong quy trình linking các thư viện, nó bao hàm các thông tin:

Đường dẫn tới thư viện, được bước đầu bằng -L, lấy ví dụ như -L./libCác thư viện bắt đầu với -l là viết tắt của lib, ví dụ: -lm khớp ứng với libm, thư viện math có sẵn trong hệ thống

$ export LDFLAGS+=" -L./lib -lm"gcc : Complier mang lại C source và g++ là complier cho C++ source

Tiếp một ý bổ sung cập nhật của anh Minatu

Có một thông số hơi quan tiền trọng. Đó là sysroot, tức là đường dẫn đến thư mục root (/).Khi tìm tệp tin header thời điểm compile thì gcc đang làm đường truyền base nhằm tìm các file .h.Nó thường có một tập những thư mục mặc định như /usr/local/include,.. Nhằm tìm kiếm những file stdio.h, string… khi đó, nó đã tìm trên phố dẫn đầy là sysroot/usr/local/include.Khi linking cũng thế, nếu băng thông là /usr/lib thì mặt đường dẫn không thiếu khi tìm đã là sysroot/usr/lib.Nếu biên dịch native thì sysroot chính là /. Còn nếu áp dụng cross-compiler đặc thì đường dẫn này hay khác.Có thể hiển thị mẫu này bởi tham số –print-sysroot mang đến gcc. Bạn có thể thao tác bình chọn nhanh bằng lệnh gcc -print-sysrootCó thể thêm -v vào câu lệnh biên dịch nhằm thấy đúng mực các tham số của gcc. Ví dụ như trong ví dụ như trên ta thêm -v sinh sống lệnh demo$ gcc -c main.c $CFLAGS -v

Tạm kết

Thế là hoàn thành được những bước cơ bạn dạng đầu tiên cùng với Crosscompiler, khám phá được một chút về cách để compile source .c đối chọi giản. Mới bước đầu làm quen cố gắng là đủ, hứa hẹn mọi bạn ở bài bác tiếp theo.