COMPILE LÀ GÌ

  -  

Compiler là gì ? Cross Compiler là gì ? Nó có liên quan gì cho tới một khối hệ thống nhúng ? mình cùng khám phá một số khái niệm cơ bạn dạng trong bài bác này nhé.Bạn đang xem: Compile 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ông việc dịch chuỗi câu lệnh được viết tự một ngữ điệu lập trình thành chương trình tương tự dưới dạng ngữ điệu máy tính, thường là ngôn ngữ ở thấp cấp hơn, ngôn ngữ máy. Đơn giản dễ dàng nắm bắt thì hoàn toàn có thể tạm nói là dựa vào Complier này cơ mà file .c bọn họ 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ỳ.

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

Quá trình biên dịch


*

Chúng ta rất có thể xem sơ đồ chi tiết quá trình từ Code/Build/Run sống hình sau


*

Thông thường xuyên nếu sử dụng chương trình nhằm lập trình như Keil C ví dụ điển hình thì chỉ việc ấn một nút Build/Run xong là họ chỉ bài toán ngồi chờ và chương trình được nạp trực tiếp vào chip luôn, tuy nhiên ẩn đằng sau những nút này là 1 trong những loạt hoạt động theo công việc như hình trên.

Cross Compiler/ Toolchain là gì ?

Cross Compiler hay còn được gọi là Toolchain hoàn toàn có thể được hiểu là 1 source code được viết trên laptop chạy trên chip Intel, sau khi thông qua một cross compiler sẽ cho ra file nhị phân có công dụng chạy được trên một nền tảng gốc rễ chip khác là ARM. Một ví dụ như cơ phiên bản nhất là tôi đã dùng một laptop hệ điều hành và quản lý Ubuntu nhằm build ra một file image có thể chạy trên Raspberry Pi


*

Qúa trình tạo ra và thực hiện cross compiler/ tool chain có tương quan tới 3 đối tượng

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

Xem thêm: Game Thủ Aoe Số 1 Thế Giới Là Ai? Những Thông Tin Chưa Từng Được Tiết Lộ


*

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


*

Binutils: là 1 trong tập các công cầm cố để sinh sản và làm chủ file nhị phân (bin) của target CPUas : là assembler, nó ra đời mã nhị phân (binary code) từ bỏ assembler source codeld : trình link (linker)ar, ranlib : ra đời 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 tệp tin nhị phân nhằm giảm size của chúng

Thông thường để cross-compiler một công tác ta phải cài đặt biến môi trường thiên nhiên mới 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 sử dụng làm interface thân 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 trong những libb hoàn toàn có thể kể mang lại như: glibc, uClibc, eglibc, dietlibc, newlib, …
Kernel headerCung cấp các API quan trọng cho Applications cùng 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 tương đối nhiều ngôn ngữ với nhiều bản vẽ xây dựng CPU không giống nhau như ARM, MIPS, PowerPC, SuperH, x86; tuy vậy mình chỉ nói đến ngôn ngữ C/C++ và bản vẽ xây dựng CPU là ARM cùng x86.GDB Debugger: Trình gỡ rối, trợ giúp cho quá trình phát hiện nay lỗi lúc develop application.

Xem thêm: Ends Là Gì - Đâu Là Sự Khác Biệt Giữa End Và Ends Và Ended

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 check version hiện tất cả của gcc/g++ và download đặt

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

Ví dụ

Xét một lấy một ví dụ cơ bạn dạng với công tác 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ì bọn họ lưu code xấp xỉ dạng file là main.c, tiếp đến thực hiện nay gõ lệnh command sau bên trên ubuntu

$ export CFLAGS="-I./include -DDEBUG -Wall -g" $ export LDFLAGS+=" -L./lib -lm" $ gcc -c main.c $CFLAGS #tạo file 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ơ bạn dạng nhất của GCC

CFLAGSC 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:

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

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

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

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

$ export LDFLAGS+=" -L./lib -lm"gcc : Complier đến C source cùng g++ là complier mang lại C++ source

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

Có một thông số kỹ thuật hơi quan trọng. Đó là sysroot, có nghĩa là đường dẫn mang lại thư mục root (/).Khi tìm tệp tin header dịp compile thì gcc đã làm đường dẫn base nhằm tìm các file .h.Nó thường có một tập những thư mục mang định như /usr/local/include,.. Nhằm tìm kiếm các file stdio.h, string… khi đó, nó đang tìm trên đường dẫn đầy là sysroot/usr/local/include.Khi linking cũng thế, nếu đường dẫn là /usr/lib thì mặt đường dẫn khá đầy đủ khi tìm đang là sysroot/usr/lib.Nếu biên dịch native thì sysroot đó là /. Còn nếu sử dụng cross-compiler đặc thì băng thông này thường khác.Có thể hiển thị chiếc này bởi tham số –print-sysroot mang đến gcc. Bạn cũng có thể thao tác đánh giá 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 đắn các tham số của gcc. Ví như trong ví dụ trên ta thêm -v làm việc lệnh demo$ gcc -c main.c $CFLAGS -v

Tạm kết

Thế là ngừng được những bước cơ bạn dạng đầu tiên với Crosscompiler, tìm hiểu được một chút ít về phương pháp để compile source .c đối chọi giản. Mới bước đầu tiên làm quen nỗ lực là đủ, hứa mọi người ở bài tiếp theo.