Hướng dẫn viết Makefile đơn giản

Chúng tôi rất vui mừng được chia sẻ kiến thức sâu sắc về từ khóa Makefile la gi và hy vọng rằng nó sẽ hữu ích cho bạn đọc. Bài viết tập trung trình bày ý nghĩa, vai trò và ứng dụng của từ khóa này trong việc tối ưu hóa nội dung trang web và chiến dịch tiếp thị trực tuyến. Chúng tôi cung cấp các phương pháp tìm kiếm, phân tích và lựa chọn từ khóa phù hợp, cùng với các chiến lược và công cụ hữu ích. Hy vọng rằng thông tin mà chúng tôi chia sẻ sẽ giúp bạn xây dựng chiến lược thành công và thu hút lưu lượng người dùng. Xin chân thành cảm ơn sự quan tâm và hãy tiếp tục theo dõi blog của chúng tôi để cập nhật những kiến thức mới nhất.

Phần 1 viết hướng dẫn makefile đơn giản nhất nằm trong series Makefile cơ bản mà mình hiện nay đang làm, mọi thứ đều bắt nguồn từ vướng mắc Makefile là gì ? nằm trong nội dung bài viết cũng lâu lâu lắm rồi, trước năm 75 thì phải 😀

Bạn Đang Xem: Hướng dẫn viết Makefile đơn giản

Make được dùng làm tự động hóa chuyển đổi mã nguồn thành một tệp thực thi. Ưu điểm của make script là bạn cũng có thể chỉ định mối liên quan của khá nhiều thành phần trong Khóa học của mình qua make, và make sẽ biết cái nào liên quan tới cái nào và khi nào cần thực hiện những thứ đó. Với việc sử dụng thông tin này, sẽ giúp tối ưu hóa quá trình build và tránh các bước không cấp thiết.

Makefile cơ bản

Thông thường với make thì sẽ thực thi các lệnh được lưu trong một file gọi là Makefile. Ở đây là một Makefile cơ bản nhất cho Khóa học helloworld.c

#include <stdio.hvàgt; main( int argc, char *argv[] ) { printf( “Hello, worldn” ); }

Xem Thêm : File CDR là gì? Điểm danh các phần mềm hỗ trợ xem file CDR

Makefile

hello: hello.c gcc hello.c -o hello clean: rm -f *.o hello

Sau lúc chạy thử và thực thi Khóa học sẽ sở hữu được kết quả như sau

$ make gcc hello.c -o hello $ ./hello Hello, world

Mục tiêu chính của makefile là build Khóa học, nếu target output có dạng như gcc hello.c -o hello tức là Khóa học không được build hoặc có update mới.

Thông thường source code thường là không hoàn chỉnh và phải được tạo ra từ những phương tiện như flex hoặc bison,sau đó nó sẽ tiến hành compile thành binary object(file .o). Sau đó, khi đối chiếu với C / C ++, các tệp đối tượng người tiêu dùng được liên kết với nhau bằng một trình liên kết (linker) (thường được gọi thông qua trình biên dịch, gcc) để tạo thành một Khóa học thực thi.

Targets và Prerequisite

Một makefile cấp thiết thì sẽ gồm có nhiều rule để build ứng dụng. Rule đơn giản nhất gọi là rule mặc định(default rule), rule này gồm 3 phần: mục tiêu(target), ĐK(prerequisite) và command thực hiện

Xem Thêm : Private company limited by shares là gì, cấu trúc và cách dùng cụm từ Private company limited by shares trong tiếng Anh 

target: prereq1 prereq2 commands

  • Target: file bạn phải make
  • prerequisites hay dependent: là những file cần phải tồn tại trước lúc target được tạo thành công
  • command: là shell command tạo ra target từ prerequisites

Ví dụ:

foo.o: foo.c foo.h gcc -c foo.c

Target ở đây là foo.o nằm trước dấu hai chấm, prerequisites là foo.c và foo.h, command là gcc -c foo.c, trước command là tab chứ không phải là space nha bạn bè

Tiếp theo là một ví dụ đếm số chữ trong các từ “fee,” “fie,” “foe,” và “fum” trong input. Khóa học này sử dụng flex scanner trong Khóa học main

Flex scanner là gì ? Ở đây là nguyên văn tiếng anh mô tả của nó tại Ubuntu, hiểu đơn giản thì nó là Khóa học gen code c và scan input, đó cũng là mục tiêu chính của việc dùng tool này

flex is a tool for generating scanners: programs which recognized lexical patterns in text. flex reads the given input files, or its standard input if no file names are given, for a description of a scanner to generate. The description is in the form of pairs of regular expressions and C code, called rules. flex generates as output a C source file, lex.yy.c, which defines a routine yylex(). This file is compiled and linked with the -lfl library to produce an executable. When the executable is run, it analyzes its input for occurrences of the regular expressions. Whenever it finds one, it executes the corresponding C code.

Để tùy chỉnh flex ubuntu dùng lệnh sau

sudo apt-get update sudo apt-get install flex

Khóa học chính count_word.c

#include <stdio.hvàgt; #include <stdlib.hvàgt; extern int fee_count, fie_count, foe_count, fum_count; extern int yylex(void); int main(int argc, char **argv) { yylex(); printf(“%d %d %d %dn”, fee_count, fie_count, foe_count, fum_count); exit(0); }

Khóa học scanner lexer.l

int fee_count = 0; int fie_count = 0; int foe_count = 0; int fum_count = 0; %% fee fee_count++; fie fie_count++; foe foe_count++; fum fum_count++;

Xem Thêm : File CDR là gì? Điểm danh các phần mềm hỗ trợ xem file CDR

Makefile

count_words: count_words.o lexer.o -lfl gcc count_words.o lexer.o -lfl -ocount_words count_words.o: count_words.c gcc -c count_words.c lexer.o: lexer.c gcc -c lexer.c lexer.c: lexer.l flex -t lexer.l > lexer.c clean: rm -f *.o lexer.c count_words

Kết quả sau thời điểm thực thi Makefile, sau thời điểm run Khóa học thực thi ta thấy các từ “fee,” “fie,” “foe,” và “fum” mỗi từ đều phải sở hữu 3 vần âm nên kết quả sẽ là 3 3 3 3

$ make gcc -c count_words.c flex -t lexer.l > lexer.c gcc -c lexer.c gcc count_words.o lexer.o -lfl -ocount_words $ ./run-run $ count_words < lexer.l int _count = 0; int _count = 0; int _count = 0; int _count = 0; %% _count++; _count++; _count++; _count++; 3 3 3 3

Kiểm tra Dependency

Makefile ở Khóa học trên có nhiều mục và đều liên quan với nhau, làm thế nào để make biết phải làm gì ? kiểm tra tính phụ thuộc(dependency) là sao ?

Trước tiên hãy lưu ý rằng command không chứa target để nó quyết định make default goal là count_words. Nó kiểm tra các prerequisite và thấy có ba ĐK: count_words.o, lexer.o và -lfl. lúc này hãy xem xét cách make count_words.o và rule cho nó Tiếp tục, nó kiểm tra prerequisites, thông tin rằng count_words.c không có quy tắc nào ngoài việc tệp tồn tại, do đó, make chuyển đổi count_words.c thành count_words.o bằng phương pháp thực hiện lệnh: gcc -c count_words.c

Prerequisite tiếp theo mà make cần phải xem xét là lexer.o. Rule của nó được thực thi trên file lexer.c, tuy nhiên file này sẽ không tồn tại, make sẽ tìm rule để tạo ra file này từ lexer.l, do đó nó sẽ run Khóa học flex. Khi lexer.c được tạo ra nó có thể run gcc command

Cuối cùng make sẽ thực thi -lfl, -l ở đây có tức là thư viện được link tới ứng dụng. Thư viện chính cần link ở đây là fl(libfl.a), GNU make tương trợ syntax -lvàlt;NAMEvàgt;, khi make thấy lờ thì nó sẽ đi tìm cờ, cờ ở đây là file có dạng libNAME.so, nếu tìm k thấy file này nó sẽ tìm file libNAME.a, khi đã tìm ra thì công việc cuối cùng là linking.

Tối ưu output sau build

Sau lúc run Khóa học ngoài đoạn output cấp thiết là 3 3 3 3 thì ta thấy còn build thêm mấy đoạn code thừa từ lexer, đây là thứ mà tất cả chúng ta hoàn toàn không mong muốn. Lỗi ở đây là vì tất cả chúng ta quên một số rule trong flex. Để khắc phục tình trạng này thì ta cần add thêm n như sau

int fee_count = 0; int fie_count = 0; int foe_count = 0; int fum_count = 0; %% fee fee_count++; fie fie_count++; foe foe_count++; fum fum_count++; . n

Sau lúc xong ta sẽ sở hữu được kết quả như sau

$ make gcc -c count_words.c flex -t lexer.l > lexer.c gcc -c lexer.c gcc count_words.o lexer.o -lfl -o count_words $ ./run-run $ count_words < lexer.l 3 3 3 3

Tạm kết

Giờ đây bạn đã sở hữu một sự hiểu biết cơ bản về make và có thể viết makefile của riêng mình. Ở đây tôi đã nỗ lực nói đủ cú pháp và cấu trúc của makefile cơ bản nhất để bạn cũng có thể mở màn sử dụng make. Tất nhiên sẽ sở hữu được phần nói rõ hơn về rule, make variable,.. ở bài tiếp theo. Bạn hữu tĩnh tâm hóng nhé.

You May Also Like

About the Author: v1000