Nội dung biên dịch C Biên dịch và thực thi chương trình C/C++ Giới thiệu về process Tổ chức của một process Background và foreground process Các lệnh thao tác với process Lập
Trang 3 Ký tự mẫu (wild cards): ?, *, []
find pathname -name filename -print
Rpm, grep, which, whereis, locate
Trang 5Môi trường lập trình
Trang 6Nội dung biên dịch C
Biên dịch và thực thi chương trình C/C++
Giới thiệu về process
Tổ chức của một process
Background và foreground process
Các lệnh thao tác với process
Lập trình process với fork(), exec…()
Trang 7Quá trình tạo tập tin thực thi
Tập tin Obj N
Liên Kết Tập Tin
Thực Thi
Loader
Image tiến trình trong bộ nhớ
Trang 8Các công cụ
Thư viện các hàm tiện ích: libc, libstdc++, …
Các trình biên dịch: gcc, g++, gcj, gas, …
Trình khử lỗi : gdb
Trình tiện ích khác:
nm, strip, ar, objdump, ranlib(dùng lệnh info
binutils để xem thêm)
Tiện ích: gmake, make, …
Trang 9Trình biên dịch GNU C/C++
Công cụ dùng biên dịch các chương trình C/C++
Quá trình biên dịch thành file thực thi gồm 4 giai
Bước 1, 2, 3 thường xử lý một tập tin đầu vào
Bước 4: liên kết nhiều object module liên quan để tạo thành tập tin thực thi nhị phân
có thể can thiệp vào từng bước
Trang 10gcc -E Hello.c -o Hello.cpp
gcc -S Hello.c [-o Hello.s]
gcc -c Hello.c [-o Hello.o]
gcc Hello.c [-o Hello]
gcc c.o b.o Hello.o [-o Hello]
Trang 11Thực hiện bước tiền xử lý -E
Chèn mã hỗ trợ Debug -g
Tối ưu mã thực thi -O [n]
Tên thư mục chứa các thư viện Lib dạng (.a , so )
Trang 14Biên dịch chương trình C/C++
Biên dịch(không link) một file chương trình nguồn C đơn lẻ
Gcc -c main.c
Kết quả là object file tên main.o
Biên dịch(không link) file chương trình nguồn C++
g++ -c myprog.cpp
Kết quả là file object tên là myprog.o
Biên dịch(không link) main.c có sử dụng các file *.h trong thư
mục “include/” (dùng tùy chọn -I để chỉ định đường dẫn)
Trang 15Biên dịch chương trình C/C++
Liên kết(link) nhiều file đối tượng(object files) đã có
g++ -o myapp main.o reciprocal.o
Gcc -o myapp main.o reciprocal.o
Tên file tạo ra là gì? Cho biết quyền hạn trên file đó?
Thựcthitạidấunhắclệnh: $ /myapp 3
Liên kết object files với các thư viện(libraries) khác
Liên kết với thư viện chuẩn POSIX pthread
(/usr/lib/libpthread.so)
Gcc -o myapp main.o -lpthread
Liên kết với thư viện libutility.a ở thư mục /usr/local/lib/somelib
Gcc -o myapp main.o -L/usr/local/lib/somelib -lutility
Liên kết với thư viện libtest.so ở thư mục làm việc hiện hành
Gcc -o myapp main.o -L -ltest
Trang 16Biên dịch chương trình C/C++
Lưu ý khi biên dịch trong Linux
Dùng g++ nếu chương trình có chứa mã C lẫnC++
Dùng gcc nếu chương trình chỉ có mã C
Tập tin thực thi tạo ra không có đuôi exe, dll như môi trường
Windows
Giả sử ứng dụng gồm nhiều hơn một tập tin source code, chẳng
hạ như main.c và reciprocal.c Để tạo thành chương trình thực
thi, có thể biên dịch trực tiếp bằng một lệnh gcc như sau:
Trang 17Thư viện lập trình trong Linux
Thư viện tĩnh
Thư viện động
Trang 18Thư viện lập trình trong Linux
Giả sử có 2 tập tin: a.c, b.c
Int sum(int a,int b) { Int mult(int a,int b) {
Trang 19Thư viện lập trình trong Linux
Tạo thư viện tĩnh có tên là “libcal.a”
Biên dịch tạo tập tin Object:
Dùng lệnh ar để tạo thư viện
Dùng lệnh nm xem kết quả
Dùng lệnh file để xem loại tập tin
Trang 20Thư viện lập trình trong Linux
Biên dịch có liên kết tới thư viện
Trang 21Thư viện lập trình trong Linux
Thư viện động
Tương tự “.DLL”
Thư mục mặc định:
Tạo thư viện động “libcal.so”
Biên dịch với tùy chọn -fPIC
Tạo thư viện
Dùng lệnh xem tập tin
Trang 22Thư viện lập trình trong Linux
Biên dịch tương tự
Để thực thi
Chép thư viện tới /lib
Thay đổi biến môi trường: LD_LIBRARY_PATH
Xác định thư viện phụ thuộc
ldd myapp
Trang 23Q/A