01/10/2018, 16:57

Khi build code thì complier sẽ build phần nào đầu tiên trong file.c?

Chào các anh,
Cho em hỏi khi mình build code thì complier sẽ build phần nào đầu tiên trong file.c
Em có tìm trên diễn đàn nhưng không thấy, từ khóa em search chắc chưa đúng.
Em cám ơn

Mai Anh Dũng viết 19:10 ngày 01/10/2018

Khi build thì complier sẽ build cả file chứ sao lại là từng phần? Mà em hỏi câu hỏi này để làm gì?

cao nguyen viết 19:11 ngày 01/10/2018

Hi anh,
Dạ ý em build cà file nhưng build phần macro trước hay build trong main() trước…
Da em mới code có thắc mắc, anh có thể giải thích giúp em.
Em cám ơn

明玉 viết 19:12 ngày 01/10/2018

Compiler sẽ build lần lượt từng file c hoặc c++, header không bao giờ đc build.
File c đó nếu include những file khác, những file khác lại include hơn nữa thì coi như compiler ghép hết những file đó lại thành 1 file khổng lồ để build, include chỗ nào thì ghép chỗ đó.
Ghép xong rồi nhưng trước khi compile thì có 1 bước là preprocessing, đây chính là bước để resolve các macro và các template.
Sau khi có code đầy đủ thì mới qua bước compile, compile xong được file mã máy gọi là object file.
Sau khi đã compile xong được một đống object file thì qua bước cuối là link, ghép và liên kết các object file lại thành executable file.

cao nguyen viết 19:12 ngày 01/10/2018

Hi anh 明玉MeigyokuThmn,
Em chưa hiểu lắm, nhưng để search thêm.
Em cám ơn các anh.

*grab popcorn* viết 19:08 ngày 01/10/2018

Nhấn nút compile thì
Bước đầu là tiền xử lý. (Pre Processing). Bước này compiler sẽ exand hết macro và các pre-processor có sử dụng (lưu ý, typedef không tính nhé)
Bước này có lệnh gcc là

gcc -E hello.c > hello.i //chứa code đã được expand

Bước tiếp theo là biên dịch mã nguồn sang Assembly. Trong GCC bạn gõ lệnh là sẽ ra được file .s là file chứa mã lệnh assembly

gcc -S hello.i -o hello.s

Khi có file .s ta sẽ tiến thành biên dịch từ assembly sang object code. Giai đoạn này gọi là assembler. gcc có hỗ trợ GNU Assember để làm việc này, thường biết tới tên là GAS hoặc lệnh as.
Tới bước này khi biên dịch xong một lần nữa ta sẽ có file gọi là file object chứa object code.

gcc -c hello.s -o hello.o
//hoặc
as -o hello.o hello.s

Bước cuối cùng là linking.
Một phần mềm sẽ hỗ trợ việc làm việc này gọi là linker. Có thể gọi linker thông qua lệnh ld. Tiếc là bước này không dùng gcc được nữa.
Bước này giúp kết nối các object file và thư viện bên ngoài thành một file thực thi được, hay một thư viện để bạn có thể đem đi chỗ khác xài. Nói chung khi xong bước này bạn đã có 1 file để sử dụng.

ld -o hello.exe hello1.o hello2.o -lmath -lpthread ...

Cuối cùng thì chạy thôi

./hello.exe
cao nguyen viết 19:01 ngày 01/10/2018

Dạ,
Anh có Link nói về việc này không?
Em cám ơn

*grab popcorn* viết 19:04 ngày 01/10/2018

Bạn có thể tham khảo
https://www3.ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html
http://codingfreak.blogspot.com/2008/02/compilation-process-in-gcc.html

Bài liên quan
0