Lập trình C trên linux
White

Minh Tú Anh viết ngày 08/08/2018

Lập trình C trên linux

Mục tiêu bài viết giải thích quá trình build code trong lập trình C trên linux, mối quan hệ giữa compiler và linker...

với ngôn ngữ C, trình biên dịch của nó là gcc thường được đặt trong thư mục /usr/bin hoặc /usr/local/bin (kiểm tra bằng lệnh which gcc).
Khi biên dịch, ngoài file source code ltv viết, gcc cần đến nhiều file hỗ trợ hơn, ví dụ: tập tin tiêu đề, tập tin thư viện... Kết quả của quá trình biên dịch sẽ ra một file đối tượng có đuôi .o
Một vài file .o này tạo thành thư viện liên kết (có 2 loại tĩnhđộng sẽ giải thích sau)
Trình liên kết ld sẽ liên kết các file .othư viện để ra một file nhị phân có thể thực thi được.

chú ý: trong trình liên kết ld có sẵn bộ phận tái định vị, tuy nhiên không nói ở đây

Sau đây chúng ta sẽ đi tìm hiểu các tập tin tiêu đề và tập tin thư viện

tập tin tiêu đề (còn gọi là header, ví dụ #include < stdio.h > thì stdio.h là một header) chứa định nghĩa hàm và các khai báo cần thiết trong quá trình biên dịch. Trình biên dịch sẽ dò tìm tự động các file này trong thư mục chuẩn /usr/include hoặc /usr/local/include
Tuy nhiên, nếu chúng ta tự viết các header, trong câu lệnh biên dịch, cần chỉ rõ đường dẫn đến header này sử dụng tùy chọn -I. Ví dụ:
$ gcc –I/usr/mypro/include –o test test.c
chúng ta có thể sử dụng các hàm được khai báo trong header này, phần thân hàm được triển khai trong các tập tin thư viện

Gợi ý: Sử dụng câu lệnh man scanf để biết muốn sử dụng hàm scanf cần include header nào

Tập tin thư viện trong C là file triển khai thân hàm của các hàm được định nghĩa trong header, thường có đuôi .a, .so, .sa và bắt đầu bằng tiếp đầu ngữ lib. Tập tin thư viện là tập hợp của các file .o do trình biên dịch tạo ra.
Linux có 2 kiểu thư viện là thư viện liên kết tĩnh (Thư viện liên kết tĩnh là các thư viện khi liên kết trình biên dịch sẽ lấy toàn bộ mã thực thi của hàm trong thư viện đưa vào chương trình chính) và thư viện liên kết động (Các hàm trong thư viện liên kết động không trực tiếp đưa vào chương trình lúc biên dịch và liên kết, trình liên kết chỉ lưu thông tin tham chiếu đến các hàm trong thư viện liên kết động. Vào lúc chương trình nhị phân thực thi, Hệ Điều Hành sẽ nạp các chương trình liên kết cần tham chiếu vào bộ nhớ, thường có đuôi .so ). Thông thường, trình liên kết ld sẽ tìm thư viện chuẩn trong 2 thư mục /usr/lib/lib. Để chỉ định tường minh một thư viện nào đó, chúng ta làm như sau:
$ gcc test.c –o test /usr/lib/libmatlap.a
viết gọn:
$ gcc test.c –o test -lmatlap
Nếu thư viện của chúng ta không nằm trong thư mục chuẩn, ta phải thêm tùy chọn -L
$ gcc test.c –o test -L/usr/myproj/lib -ltool

cụ thể các câu lệnh

gcc -o program program.c
--> câu lệnh bao gồm tất cả các quá trình biên dịch, liên kết,...

=============================================

gcc -c program.c
--> chỉ biên dịch program.c, file đối tượng output là program.o
gcc -o program program.o cong.o nhan.o
--> liên kết các file .o thành file thực thi

=============================================
gcc -c program.c
--> biên dịch program.c, file đối tượng output là program.o
ar cvr libdemo.a cong.o nhan.o
--> tạo thư viện liên kết tĩnh demo.a từ các file đối tượng
gcc -o program program.o -L -ldemo
--> tạo file thực thi, tùy chọn -L để chỉ định đường dẫn của thư viện

=============================================
gcc -c program.c
--> biên dịch program.c kết quả file đối tượng là program.o
gcc -c -fpic cong.c nhan.c
--> tạo các file đối tượng để phục vụ tạo thư viện liên kết động
gcc -fshare cong.o nhan.o -o libdemo.so
--> tạo thư viện liên kết động
gcc -o program program.o -L. -ldemo
--> tạo file thực thi

chú ý: Trong th liên kết động phải thiết lập biến môi trường
LD_LIBRARY_PATH=.:
export LD_LIBRARY_PATH

Tham khảo: Link

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Minh Tú Anh

11 bài viết.
8 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
10 0
Giả sử ta có thư mục cdemo trong thư mục cdemo, ta có 3 file main.c, sum.c, sum.h với nội dung lần lượt như sau main.c include "sum.h" int ma...
Minh Tú Anh viết 11 ngày trước
10 0
White
8 5
Đặt vấn đề mình đang phải đọc một quyển ebook tiếng anh, khổ nỗi tiếng anh thì có hạn. Vì vậy mình thường xuyên phải alt+tab giữa ebook vs google ...
Minh Tú Anh viết 1 tháng trước
8 5
White
6 0
1. Intent là gì ? Intents là một thành phần quan trọng trong android. Nó cho phép các thành phần ứng dụng có thể yêu cầu các hàm từ các thành phần ...
Minh Tú Anh viết 1 năm trước
6 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
11 bài viết.
8 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!