Báo Cáo Bài Tập Lớn_2.Doc

23 4 0
Báo Cáo Bài Tập Lớn_2.Doc

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Báo cáo bài tập lớn BÁO CÁO BÀI TẬP LỚN MÔN NGUYÊN LÝ HỆ ĐIỀU HÀNH ĐỀ TÀI TÌM HIỂU LẬP TRÌNH C TRÊN LINUX Nhóm thực hiện Trần Minh Phương, Bùi Long Hưng, Luân Quốc Vinh, Nguyễn Duy Hiếu A Mục lục B Lờ[.]

BÁO CÁO BÀI TẬP LỚN MÔN: NGUYÊN LÝ HỆ ĐIỀU HÀNH ĐỀ TÀI: TÌM HIỂU LẬP TRÌNH C TRÊN LINUX Nhóm thực : Trần Minh Phương, Bùi Long Hưng, Luân Quốc Vinh, Nguyễn Duy Hiếu A.Mục lục B.Lời mở đầu Hiện nay, biết, lập trình phần mềm mảng lớn quan trọng ngành cơng nghệ thong tin tồn giới, quốc gia đầu lĩnh vực Ấn Độ Với yêu cầu ngày cao thị trường, người lập trình viên cần có trình độ ngày cao Các ngơn ngữ sử dụng ngày đa dạng để đáp ứng nhu cầu Chúng ta nghe tới ngơn ngữ lập trình C, C++, C#, Java … Đó ngơn ngữ lập trình mạnh sử dụng phổ biến Trên giới nay, người sử dụng máy tính tiếp cận với hệ điều hành khác nhau, bật hai hệ điều hành lớn Linux Windows Windows bật với tính dễ sử dụng, phổ biến, thích hợp với nhiều đối tượng Trong đó, Linux bật với tính bảo mật cáo Sử dụng mã nguồn mở nên bạn có hệ điều hành riêng Linux phù hợp với hệ thống lớn có tính bảo mật cao Tổng quan báo cáo Phạm vi vấn đề tìm hiểu : Tìm hiểu chung xung quanh việc lập trình ngơn ngữ C hệ điều hành.Cách viết chương trình C HĐH Linux Cách biên dịch chương trình cài đặt Các vấn đề liên quan : tìm hiểu hệ điều hành linux, biết sơ lược hệ điều hành linux điều linux, đặc biết shell Ngoài việc biên dịch code trực tiếp shell, dung IDE để biên dịch, số Codeblock C Tổng quan Trong phần báo cáo tìm hiểu vấn đề xung quanh vịêc lập trình C hệ điều hành Linux :  Tìm hiểu sơ qua hệ điều hành Linux  tổng quan viết chương trình C, công cụ sử dụng  Cách biên dịch chương trình (Phần báo cáo khơng sâu vào vấn đề cách viết lệnh hay lập trình chi chiết chương trình mà tìm hiểu chung vấn đề Tìm hiểu bước làm chương trình trình thực lập trình C Linux.) Qua phần báo này, hiểu them khái niệm lập trình C hệ điều hành Linux, có nhìn tổng quan xung quanh vịêc viết chương trình Cơng cụ sử dụng để Lập trình C Linux: Để lập trình C Linux, bạn cần có số tài liệu, phương tiện để thực nó:  Cài đặt hệ điều hành Linux (Có thể có nhiều phiên Redhat, Ubuntu, Knoppix…)  Một IDE để biên dịch code: CodeBlock hay Eclipse… D.Trình bày chi tiết phần lý thuyết - Chi tiết lập trình C Linux I Tìm hiểu chung hệ điều hành Linux Đặc điểm HĐH Linux Do mã nguồn Linux phân phối tự miễn phí, nên từ đầu có nhiều nhà lập trình tham gia vào q trình phát triển hệ thống Nhờ đến thời điểm Linux hệ điều hành đại, bền vững phát triển nhanh nhất, hỗ trợ cơng nghệ gần Linux có tất khả năng, đặc trưng cho hệ điều hành đầy đủ tính dịng UNIX Xin đưa danh sách ngắn gọn khả Nhiều tiến trình thật Tất tiến trình độc lập, khơng tiến trình cản trở cơng việc tiến trình khác Để làm điều nhân thực chế độ phân chia thời gian xử lý trung tâm, chia cho tiến trình khoảng thời gian thực Cách hoàn toàn khác với chế độ “nhiều tiến trình đẩy nha” thực Windows 95, tiến trình phải nhường xử lý cho tiến trình khác (và làm chậm trễ lâu việc thực hiện) Truy cập nhiều người dùng Linux khơng HĐH nhiều tiến trình, Linux hỗ trợ khả nhiềungười dùng làm việc lúc Khi Linux cung cấp tất tàinguyên hệ thống cho người dùng làm việc qua terminal xa khác Swap nhớ lên đĩa Swap nhớ cho phép làm việc với Linux dung lượng nhớ có hạn Nội dung số phần (trang) nhớ ghi lên vùng đĩa cứng xác định từ trước Vùng đĩa cứng coi nhớ phụ thêm vào Việc có làm giảm tốc độ làm việc, cho phép chạy chương trình cần nhớ dung lượng lớn mà thực tế khơng có máy tính Tổ chức nhớ theo trang Hệ thống nhớ Linux tổ chức dạng trang với dung lượng 4K Nếu nhớ đầy, HĐH tìm trang nhớ lâu không sử dụng để chuyển chúng từ nhớ lên đĩa cứng Nếu có trang số trang lại trở thành cần thiết, Linux phục hồi chúng từ đĩa cứng (vào nhớ) Một số hệ thống Unix cũ số hệ thống đại (bao gồm Microsoft Windows) chuyển lên đĩa tất nội dung nhớ thuộc ứng dụng không làm việc thời điểm thời (tức TẤT CẢ trang nhớ thuộc ứng dụng lưu lên đĩa không đủ nhớ) hiệu Nạp môđun thực “theo yêu cầu” Nhân Linux hỗ trợ việc cung cấp trang nhớ theo yêu cầu, phần mã cần thiết chương trình nằm nhớ, cịn phần mã khơng sử dụng thời điểm nằm lại đĩa Cùng sử dụng chương trình Nếu cần chạy lúc nhiều ứng dụng đó6, Linux nạp vào nhớ mã chương trình tất tiến trình giống sử dụng mã Thư viện chung Thư viện – trình (thao tác) chương trình dùng để làm việc với liệu Có số thư viện tiêu chuẩn dùng lúc cho vài tiến trình Trên hệ thống cũ thư viện nằm tập tin chương trình, thực lúc chương trình dẫn đến hao hụt nhớ khơng đáng có Trên hệ thống (bao gồm Linux) có hỗ trợ làm việc với thư viện động (dynamic) tĩnh (static) chia ra, cho phép giảm kích thước nhớ bị ứng dụng chiếm Bộ đệm động đĩa Bộ đệm đĩa phần nhớ hệ thống dùng làm nơi lưu liệu thường dùng đĩa, nhờ nâng cao nhiều tốc độ truy cập tới chương trình tiến trình thường dùng Người dùng MS-DOS nhớ đến chương trình SmartDrive, chương trình dự trữ phần nhớ có kích thước xác định để làm đệm cho đĩa Linux sử dụng hệ thống đệm linh động hơn: nhớ dự trữ cho đệm tăng lên nhớ không sử dụng, giảm xuống hệ thống hay tiến trình cần nhiều nhớ 100% tương ứng với tiêu chuẩn POSIX 1003.1 Hỗ trợ phần khả System V BSD POSIX 1003.1 (Portable Operating System Interface – giao diện hệ điều hành lưu động) đưa giao diện tiêu chuẩn cho hệ thống Unix, thủ tục ngôn ngữ C Ngày giao diện tất hệ điều hành hỗ trợ Microsoft Windows NT hỗ trợ POSIX 1003.1 Linux 100% tương ứng với tiêu chuẩn POSIX 1003.1 Thêm vào Linux cịn hỗ trợ khả System V BSD để tăng tính tương thích System V IPC Linux sử dụng công nghệ IPC (InterProcess Communication) để trao đổi thơng tin tiến trình, để sử dụng tín hiệu nhớ chung Khả chạy chương trình HĐH khác Trong lịch sử Linux khơng phải hệ điều hành Người ta viết hàng loạt chương trình ứng dụng, có chương trình có ích khơng tồi, cho HĐH phát triển trước Linux, bao gồm DOS, Windows, FreeBSD OS/2 Để chạy chương trình Linux phát triển trình giả lập (emulator) cho DOS, Windows 3.1, Windows 95 Wine Ngồi ra, cịn có loạt chương trình tạo máy ảo7 mã nguồn mở sản phẩm thương mại: qemu, bochs, pearpc, vmware, .HĐH Linux cịn có khả chạy chương trình dành cho xử lý Intel hệ thống Unix khác, hệ thống đáp ứng tiêu chuẩn iBCS2 (intel Binary Compatibility) Hỗ trợ định dạng hệ thống tập tin khác Linux hỗ trợ số lượng lớn định dạng hệ thống tập tin, bao gồm hệ thống tập tin DOS OS/2, hệ thống tập tin mới, reiserfs, HFS, Trong hệ thống tập tin Linux, gọi Second Extended File System (ext2fs) Third Extended File System (ext3fs) cho phép sử dụng không gian đĩa cách có hiệu Khả hỗ trợ mạng Linux gắn vào mạng nội Hỗ trợ tất dịch vụ Unix, bao gồm Networked File System (NFS), kết nối từ xa (telnet, rlogin, ssh), làm việc mạng TCP/IP, truy cập dial-up qua giao thức SLIP PPP,v.v .Đồng thời có hỗ trợ dùng Linux máy chủ máy khách cho mạng khác, có chia sẻ (dùng chung, sharing) tập tin in từ xa mạng Macintosh, NetWare Windows Làm việc phần cứng khác Mặc dù HĐH Linux phát triển cho máy tính cá nhân (PC) tảng Intel 386/486, làm việc tất vi xử lý Intel 386 kết thúc hệ thống nhiều xử lý Pentium IV, bao gồm xử lý 64bit Đồng thời Linux làm việc nhiều xử lý tương thích với Intel nhà sản xuất khác, AMD Trong Internet cịn có thơng báo nói xử lý Athlon Duron AMD Linux làm việc tốt so với Intel Ngồi cịn có phiên Linux cho xử lý khác bao gồm ARM, DEC Alpha, SUN Sparc, M68000 (Atari Amiga), MIPS, PowerPC xử lý khác8 Xin nói ln sách xem xét trường hợp Linux cho máy tính tương thích với IBM II Giới thiệu qua thư viện Hầu tất chương trình đểu dựa liên kết tới thư viện nhiều Một vài chương trình sử dụng hàm C ( printf hay malooc) liên kết tới thư viện C runtime Nếu chương trình có giao diện người dùng(GUI), liên kết vào thư viện windoing Nếu chương trình bạn dùng sở liệu, người cung cấp sở liệu đưa cho bạn thư viện sử dụng truy xuất cách dễ dàng Trong trường hợp, bạn phải định xem nên chọn liên kết tới thư viện tĩnh động Nếu bạn chọn thư viện tĩnh, chương trình bạn trở nên cồng kềnh hơn, khó nâng cấp hồn thiện hơn, dĩ nhiên dễ triển khai Nếu liên kết tới thư viện động, chương trình bạn besmaller, dễ nâng cấp, khó phát triển Những phần giải thích hướng dẫn liên kết thư viện tĩnh động, xem xét yếu tố để có thêm chi tiết, đưa số quy tắc giúp cho bạn định nên chọn liên kết tới thư viện Lưu trữ Lưu trữ ( hay thư viện tĩnh) cách đơn giản lưu trữ tập hợp đối tượng file đơn lẻ.(Lưu trữ tương đương file windows có LIB) Khi bạn định lưu trữ với liên kết, liên kết tìm kiếm kho trữ tìm file đối tượng, trích chúng ra, liên kết chúng vào chương trình, với điều kiện lúc có đối tượng Bạn có tạo kho trữ lệnh Các file lưu trữ truyền thống sử dụng đuôi mở rộng a.a đuôi o chấp nhận tệp đối tượng bình thường Ở cách bạn nối test1.o test2.o thành file lưu trữ libtes.a : % ar cr libtest.a test1.o test2.o Các cờ cr cho cách tạo kho trữ Khi kết nối vào kho trữ lệnh, tìm kiếm kho trữ ký hiệu đơn giản ( hàm biến số) liên quan tới tệp đối tượng có trình chưa định nghĩa Các tệp đối tượng xác định kí hiệu rút từ kho trữ mà bắt gặp lệnh Ví dị giả định test.c chứa đoạn code Listing2.7 app.c có code phần Listing2.8 Nội dung test.c int f () { return 3; } Listing 2.8 (app.c) A Program That Uses Library Functions int main () { return f (); } Bạn sử dụng cờ để gỡ bở file từ kho trữ thực thao tác kho trữ Các trình hoạt động sử dụng dẫn chứng tài liệu trang nhớ Bây giả định test.o nối với số file đối tượng để sinh kho trữ libtest.o Sau dòng lệnh không hoạt động: % gcc -o app -L -ltest app.o app.o: In function `main': app.o(.text+0x4): undefined reference to `f' collect2: ld returned exit status Thông báo lỗi libtest.a không chứa định nghĩa file, khơng có liên kết tới file Đó libtest.a tìm kiếm có xung đột lần đầu tiên, trỏ tới liên kết khác khơng tham chiếu tới file nhắc tới Trong trường hợp khác, sử dụng dịng, khơng có thông báo lỗi đưa ra: % gcc -o app app.o -L ltest Đó lí mà tham chiếu tới file app.o liên kết tới file đối tượng test.o từ kho lưu trữ libtesr.a Sự chia sẻ thư viện Một thư viện chia sẻ ( chia sẻ đối tượng biết, liên kết động) liên kết kho trữ giống thành flie đối tượng Tuy nhiên, có nhiều khác biệt quan trọng Khác biệt quan trọng chia sẻ thư viện liên kết tới chương trình, thao tác thực cuối không chứa đựng đoạn code thư viện chia sẻ Thay vào đó, cơng việc thực đơn chứa tham chiếu tới thư viện chia sẻ Một vài chương trình hệ thống liên kết dựa vào thư viện chia sẻ tương tự, chúng tham chiếu tất thư viện, chí khơng có include Theo cách đó, thư viện bị “ chia sẻ” tất chương trình mà có liên kết tới Khác biệt quan trọng thứ hai thư viện chia sẻ không đơn tập file đối tượng, mối liên kết chọn dùng chúng cần thỏa mãn tham chiếu khơng xác định Thay vì, file đối tượng soạn thư viện chia sẻ nối vào file đối tượng đơn lẻ chương trình dựa vào liên kết thư viện chia sẻ luôn bao gồm tất code thư viện, phần chia cần Khi tạo thư viện chia sẻ, bạn phải biên dịch đối tượng cấu tạo lên thư viện cách sử dụng fPIC tùy chọn chương trình biên dịch, : % gcc -c -fPIC test1.c Tùy chọn fPIC chương trình biên dịch mà bạn sử dụng test.o phần chia sẻ đối tượng Position-Independent Code (PIC)(Vị trí độc lập code) PIC giữ vững cho Position-Independent Code Các hàm thư viện chia sẻ nạp vào địa khác chương trình khác nhau, code đối tượng chia sẻ phải khơng sinh từ địa chỉ(hoặc vị trí) nơi nạp vào Sự cân nhắc khơng ảnh hưởng đến bạn, lập trình viên, trừ bạn phải nhớ cách sử dụng cờ fPIC biên soạn code mà bạn muốn sử dụng thư viện chia sẻ Khi bạn nối file đối tượng vào htw viện chia sẻ, là: % gcc -shared -fPIC -o libtest.so test1.o test2.o Sự tùy chọn chia sẻ liên kết tạo thư viện chia sẻ hoạt động diễn bình thường Các thư viện chia sẻ sử dụng đuôi mở rộng so Như lưu trữ tĩnh, tên luôn bắt đầu với lib file thư viện Liên kết với thư viện chia sẻ liên kết với kho trữ tĩnh Ví dụ dịng sau liên kết với libtest.so thư mục tại, thư viện chuẩn tìm kiếm thư mục hệ thống: % gcc -o app app.o -L ltest Cho libtest.a libtest.so sẵn có Sau liên kết thư viện hoăc khơng khác Liên kết tìm kiếm thư mục( lý thuyết với –L tùy chọn, sau tới thư mục chuẩn) Khi liên kết tìm tới thư mục chứa libtest.a libtest.so, liên kết dừng việc tìm kiếm thư mục Nếu có hai biến thể hữu thư mục, liên kết chọn biến thể Cách khác, liên kết chọn theo phiên thư viện chia sẻ, khơng bạn phải định dẫn cách khác Bạn sử dụng, -tĩnh tùy chọn cho địi hỏi lưc trữ tĩnh Ví dụ dịng sau sử dụng lưu trữ libtest.a, dù thư viện chia sẻ libtest.so sẵn có: % gcc static -o app app.o -L ltest Lệnh hiển thị ldd thư viện chia sẻ liên kết thực Các thư viện cần sẵn có thao tác lệnh chạy Chú ý ldd liệt kê thêm vào thư viện gọi ld-linux.so, phận GNU/Linux Sử dụng LD_LIBRARY_PATH Khi bạn liên kết chương trình với thư viện chia sẻ, liên kết khơng đặt đường dẫn đầy đủ tới thư viện chia sẻ kết mục kết thu Thay đặt tên thư viện chia sẻ Khi chương trình thực chạy, hệ thống tìm kiếm thư viện chia sẻ tải Hệ thống tìm kiếm /lib /usr/lib, theo mặc định Nếu thư viện chia sẻ liên kết vào chương trình bạn cài đặt bên ngồi thư mục, tìm thấy, hệ thống từ chối chạy chương trình Một giải pháp cho vấn đề sử dụng –Wl,-rpath tùy chọn liên kết tới chương trình Cho bạn sử dụng : % gcc -o app app.o -L -ltest -Wl,-rpath,/usr/local/lib Sau app chạy, hệ thống tìm kiếm /usr/local/lib cho vài thư viện phụ thuộc Một giải pháp khác để giải đặt môi trường biến số LD_LIBRARRY_PATH chạy chương trình Như mơi trường biến PATH, LD_LIBRARRY_PATH có dấu hai chấm tách rời danh sách thư mục Ví dụ, LD_LIBRARY_PATH is /usr/local/lib:/opt/lib, then /usr/local/lib and /opt/lib tìm kiếm trước thư mục chuẩn /lib and /usr/lib Bạn nên ý bạn có LD_LIBRARRY_PATH, liên kết tìm kiếm thư mục định có bổ sung thư mục định với tùy chọn –L xây dựng thao tác thực Thư viện chuẩn Tất nhiên bạn chưa địn thư viện bạn liên kết tới chương trình bạn, tất nhiên sử dụng thư viện chia sẻ Có điều GCC tự động liên kết tới thư viện C chuẩn.,libc, cho bạn Thư viện C chuẩn không bao gồm hàm tốn học; Thay vào chúng thư viện tách rời., libm, bạn cần định cách rõ ràng Ví dụ biên dịch liên kết chương trình compute.c sử dụng hàm lượn giác sin hay cos, bạn phải dùng code:% gcc -o compute compute.c lm Nếu bạn viết chương trình C++ liên kết sử dụng lệnh C++ g++, bạn cần thư viện C++ chuẩn, libstdc++ Thư viện phụ thuộc Một thư viện thường phụ thuộc vào thư viện khác Ví dụ, nhiều GNU/Linux hệ thống bao gồm libtiff, thư viện chứa hàm đọc ghi ảnh files vào định dạng TIFF Thư viện quay vịng sử dụng thư viện libjpeg libz Phần listening 2.9 trình bày chương trình nhỏ có sử dụng libtiff để mở file ảnh TIFF Phần listening 2.9 (tifftest.c) sử dụng libtff : #include #include int main (int argc, char** argv) { TIFF* tiff; tiff = TIFFOpen (argv[1], "r"); TIFFClose (tiff); return 0; } Bạn nhận thấy khác biệt tới LD_RUN_PATH vài tài liệu trực tuyến Đừng tin vào bạn đọc; biến số không thực tồn GNU/Linux Lưu file nguồn tifftest.c Với việc biên dịch chương trình liên kết với libtiff, định –ltiff đường liên kết link bạn : % gcc -o tifftest tifftest.c ltiff Theo mặc định, thực chọn lọc phiên thư viện chia sẻ libtiff, tìm /usr/lib/libtiff.so Bởi libtiff sử dụng libjpeg libz, phiên thư viện chia sẻ hai kéo theo chúng vào(một thư viện chia sẻ trỏ tới thư viện chia sẻ khác mà phụ thuộc Để kiểm chứng điều đó, sử dụng lệnh ldd: % ldd tifftest libtiff.so.3 => /usr/lib/libtiff.so.3 (0x4001d000) libc.so.6 => /lib/libc.so.6 (0x40060000) libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x40155000) libz.so.1 => /usr/lib/libz.so.1 (0x40174000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) Thư viện tĩnh, nguồn khác, trỏ tới thư viện khác Nếu định liên kết với phiên tĩnh khác libtiff định dạng –static câu lệnh, bạn bắt gặp kí tự: % gcc -static -o tifftest tifftest.c -ltiff /usr/bin/ /lib/libtiff.a(tif_jpeg.o): In function `TIFFjpeg_error_exit': tif_jpeg.o(.text+0x2a): undefined reference to `jpeg_abort' /usr/bin/ /lib/libtiff.a(tif_jpeg.o): In function `TIFFjpeg_create_compress': tif_jpeg.o(.text+0x8d): undefined reference to `jpeg_std_error' tif_jpeg.o(.text+0xcf): undefined reference to `jpeg_CreateCompress' Việc liên kết với chương trình tĩnh, bạn phải định tới thư viện riêng bạn: % gcc -static -o tifftest tifftest.c -ltiff -ljpeg –lz Đôi khi, hai thư viện bị phụ thuộc lẫn qua lại Ở từ khác, kho trữ tham chiếu kí tự định nghĩa kho trữ thứ hai Cái hoàn cảnh tổng quát nảy sinh thiết kế, đơi xảy Trong số trường hợp, bạn định thư viện đơn nhiều thời gian dịng lệnh Kết nối tìm thông tin thư viện thời gian mà xuất Ví dụ, dịng ngun nhân libfoo.a tương lai tìm nhiều khoảng thời gian : % gcc -o app app.o -lfoo -lbar lfoo Cho dù libfoo.a tham chiếu tới kí tự libbar.a, ngược lại, chương trình liên kết thành cơng Thuận chống Bây bạn cho biết hết thứ lưu trữ tĩnh thư viện chia sẻ, bạn chắn ngạc nhiên với cách sử dụng chúng Có nhiều cân nhắc ý tới ý định bạn Một thuận lợi chủ yếu thư viện chia sẻ lưu trữ nhiều khơng gian hệ thống nơi mà chương trình đặt Nếu bạn cài đặt 10 chương trình, chúng sử dụng chung thư viện chia sẻ, bạn giải nhiều khơng gian sử dụng thư viện chia sẻ Nếu bạn sử dụng lưu trữ tĩnh thay vào đó, kho trữ bao gồm 10 chương trình Do đó, sử dụng thư viện chia sẻ giải thoát nhiều khơng gian đĩa cứng Nó giảm bớt thời gian chương trình bạn tải liệu từ Web Lợi liên quan tới thư viện chia sẻ người sử dụng nâng cấp thư viện khơng có phục thuộc vào chương trình Ví dụ cho bạn làm thư viện chia sẻ quản lí kết nối HTTP Một vài chương trình phụ thuộc vào thư viện Nếu bạn tìm lỗi thư viện, bạn nâng cấp hồn thiện thư viện lên Ngay tất chương trình phụ thuộc thư viện sửa, bạn không cần phải liên kết tất chương trình theo cách mà bạn làm với kho trữ chuẩn Sự thuận lợi khiến bạn nghĩ bạn nên luôn sử dụng thư viện chia sẻ Tuy nhiên, lại có tồn sử dụng kho trữ Sự thật việc nâng cấp thư viện chia sẻ ảnh hưởng đến tất chương trình phụ thuộc nó bất lợi Ví dụ, bạn phát triển phần mềm then chốt, bạn liên kết tới kho trữ tĩnh nhiên nâng cấp thư viện chia sẻ hệ thống khơng ảnh hưởng tới chương trình bạn (Cách khác người sử dụng nâng cấp thư viện chia sẻ, cách ngắt chương trình bạn, gọi hỗ trợ ) Nếu bạn cài đặt thư viện bạn /lib /usr/lib, bạn nên suy nghĩ chắn trước sử dụng thư viện chia sẻ Cá biệt, -Wl, -rpath thủ thuật không làm việc bạn nơi mà thư viện kết thúc Và yêu cầu thông người sử dụng thiết lập LD_LIBRARY_PATH cách thức thêm bước làm cho chúng Bởi người sử dụng phải làm cách đơn lẻ, cơng lao lớn lao họ thêm vào Bạn phải xem ảnh hưởng thuận lợi không thuận lợi cho chương trình mà bạn phân phối Nạp vào động khơng nạp Thỉnh thoảng bạn muốn nạp vào vài code thời gian chạy không dùng liên kết cho code Ví dụ , nghĩ tới ứng dụng hỗ trợ modules “plug-in”, trình duyệt web Trình duyệt cho phép bên thứ phát triển tạo plug-ins để cung ứng hàm thêm vào Trình duyệt web sau tự động nạp vào code thư viện Các hàm sẵn có sử dụng Linux sử dụng hàm dlopen Bạn mở thư viện chia sẻ tên libtest.so lời gọi dlopen là: dlopen ("libtest.so", RTLD_LAZY) Việc tải sử dụng hàm, bao gồm đầu file liên kết với tùy chọn ldl cách tình cờ Sự trả lại giá trị từ hàm void * sử dụng kênh truy cập nhớ thư viện chia sẻ.Bạn bỏ qua giá trị tới hàm dlsym tới thu địa hàm nạp vào với thư viện chia sẻ Ví dụ, libtest.so định nghĩa hàm tên my_function, bạn gọi sau: void* handle = dlopen ("libtest.so", RTLD_LAZY); void (*test)() = dlsym (handle, "my_function"); (*test)(); dlclose (handle); Hệ thống dlsym gọi sử dụng để đạt trỏ tới biến số tĩnh thư viện chia sẻ Cả dlopen dlsym trả NULL khơng thành cơng Trong việc đó, bạn gọi dlerror( khơng có tham số) để đạt thơng báo lỗi diễn tả rõ vấn đề Hàm dlclose khơng nạp vào thư viện chia sẻ Kĩ thuật, dlopen nạp thực thư viện chưa sẵn sàng nạp Nếu thư viện vào nạp, dlopen dễ dành tăng tham chiếu có giá trị Tương tự, dlclose giảm tham chiếu có giá trị khơng nạp thư viện tham chiếu có giá trị zero Nếu bạn viết code thư viên chia sẻ C++, bạn chắn muốn trình bày hàm tham số mà bạn dự định truy xuất nơi với liên kết “C” rõ Trong trường hợp đó, hàm C++ my_function thư viện chia sẻ bạn muốn truy xuất với dlsym, bạn nên trình bày sau: extern "C" void foo (); Ngăn cản trình biên dịch C++ từ việc sai tên hàm, thay đổi tên hàm từ foo tới khác biệt,các tên mã hóa thêm thơng tin hàm Một trình biên dịch khơng hỏng tên; sử dụng tên mà bạn đưa vào thông qua tên hàm biến số III Tìm hiểu chút shell Shell chương trình bạn Linux (hay nói xác bạn với nhân Linux) Mỗi lệnh bạn gõ Shell diễn dịch chuyển tới nhân Linux Nói cách dễ hiểu Shell diễn dịch ngơn ngữ lệnh, ngồi cịn tận dụng triệt để trình tiện ích chương trình ứng dụng có hệ thống… Các loại Shell thơng dụng: Trong giới Unix/Linux có nhiều Shell… 1) Shell Bourne (sh) Do Steven Bourne viết, Shell nguyên thuỷ có mặt hầu hết hệ thống Unix/Linux… Nó hữu dụng cho việc lập trình Shell khơng xử lý tương tác người dung Shell khác… 2) Bourne Again Shell (bash) Đây phần mở rộng sh, kế thừa sh có phá huy sh chưa có…Nó có giao diện lập trình mạnh linh hoạt…Cùng với giao diện lệnh dễ dung…Đây Shell cài đặt mặc định hệ thống Linux 3) Shell C (csh) Đáp ứng tương thích cho người dung…Nó hỗ trợ mạnh cho Programmer C…và với đặc tính tự động hồn thành dịng lệnh… 4) Shell Korn (ksh) Có thể nói Shell tuyệt vời, kết hợp tính ưu việt sh csh… Ngồi cịn có số Shell khác như: ssh, nfssh, mcsh… MC (Midnight Commander) Shell thực yêu cầu người dung thông qua môi trường đồ họa…Tương tự NC (Norton Commander) DOS… IV.Cách biên dịch chương trình C Ngồi vịêc sử dụng IDE biên dịch code C (ví dụ Dev C, Borland C… ), khác với việc viết chương trình C hệ điều hành khác Windows, Linux có tích hợp sẵn cơng cụ để biên dịch code cho chương trình C Như vậy, có hai cách để biên dịch chương trình C, : Sử dụng cơng cụ có sẵn hệ điều hành Linux Sử dụng IDE biên dịch code (Ở đây, tìm hiểu IDE Codeblock) a) Biên dịch cơng cụ có sẵn 1.1 Soạn thảo với Emacs Emacs trình soạn thảo văn đa chức Đây phần mềm tự do, chạy nhiều hệ điều hành mở rộng để thêm vào chức Emacs phổ biến giới lập trình máy tính người dùng máy tính thơng thạo kĩ thuật Chương trình EMACS, tên tạo từ Editor MACroS, dùng cho trình soạn thảo TECO (Text Editor and Corrector) Richard Stallman, Guy Steele Dave Moon viết năm vào 1976 Nó dựa cặp chương trình soạn thảo TECO-macro TECMAC TMACS viết Guy Steele, Dave Moon, Richard Greenblatt, Charles Frankston số người khác Qua thời gian xuất nhiều phiên Emacs, ngày phiên phổ biến GNU Emacs, Richard Stallman bắt đầu viết vào 1984, XEmacs, phân nhánh từ GNU Emacs năm 1991 Cả hai dùng ngơn ngữ Emacs Lisp có khả mở rộng mạnh mẽ, cho phép chúng xử lí nhiều tác vụ khác nhau, từ việc lập trình biên dịch chương trình máy tính đến duyệt web Emacs chạy nhiều hệ điều hành khác hệ thống giống Unix (GNU/Linux, loại BSD, Solaris, AIX, v.v.), MS-DOS, Microsoft Windows, OpenVMS Mac OS X Emacs chạy giao diện văn lẫn đồ hoạ Trên hệ điều hành giống Unix, Emacs dùng hệ thống X Window để tạo giao diện đồ hoạ trực tiếp thông qua "widget toolkit" Motif, LessTif hay GTK+ Emacs dùng giao diện đồ hoạ nguyên thuỷ Mac OS X Microsoft Windows Một số người phân biệt chữ emacs viết thường, dùng để trình biên tập giống Emacs (nhất GNU Emacs XEmacs), Emacs viết hoa chữ đầu, dùng để GNU Emacs Emacs phía chiến trình biên tập, phía bên vi Tính năng:         Soạn thảo nhiều cửa sổ (window) đệm (buffer) Tìm kiếm, thay thế, tự sửa lỗi Soạn thảo đệ quy (recursive edit): cho phép soạn thảo câu lệnh thực chừng Nhiều chế độ soạn thảo: văn thường, file chương trình, ngơn ngữ đánh dấu (HTML), LaTeX, vẽ hình kí tự Các macro bàn phím Sửa đổi theo ý thích cá nhân cách chỉnh sửa biến chương trình Lập trình ngơn ngữ Emacs Lisp Nhiều chương trình phụ trợ (danh sách thư mục, đọc soạn e-mail, trò chơi ) Một trình biên soạn (editor) chương trình mà bạn dùng để soạn thảo mã nguồn Có nhiều trình biên soạn khác dùng với Linux, trình biên soạn phổ biến đề cao đương nhiên GNU Emacs 1.1.1 Mở file nguồn C C++ Bạn khởi động Emacs cách gõ emacs cửa sổ lệnh nhấn nút Return Khi Emacs khởi động, bạn sử dụng ký hiệu phía để tạo file Bấm vào menu Files, chọn Open Files, sau gõ tên file mà bạn muốn mở vào “minibuffer” phía mành hình Nếu bạn muốn tạo file nguồn C, bạn kết thúc tên file c h Nếu bạn muốn tạo file nguồn C++, bạn kết thúc tên file cpp, hpp, cxx, hxx, C H Khi file mở ra, bạn soạn thảo mong muốn chương trình soạn thảo văn thông thường Để lưu file, chọn Save Buffer menu Files Khi bạn kết thúc sử dụng Emacs, bạn chọn Exit Emacs menu Files Nếu bạn khơng thích trỏ bấm, bạn sử dụng phím tắt để tự động mở, lưu file thoát Emacs Để mở file, bấm tổ hợp phím Ctrl+X Ctrl+F Để lưu file, bấm Ctrl+X Ctrl+S Để thoát Emacs, bấm Ctrl+X Ctrl+C Nếu bạn muốn làm quen với Emacs, bạn nên chọn mục Emacs Tutorial Help menu Tutorial cung cấp cho bạn nhiều hướng dẫn để bạn sử dụng Emacs cách hiệu 1.1.2 Tự động định dạng Nếu bạn quen với việc lập trình mơi trường phát triển hợp (Integrated Development Environment - IDE), bạn quen với việc trình biên soạn giúp bạn định dạng đoạn mã Emacs cung cấp kiểu chức tương tự Nếu bạn mở file nguồn C hay C++, Emacs tự động hiểu file chứa mã nguồn đoạn văn thơng thường Nếu bạn nhấn phím Tab dòng trống, Emacs dịch chuyển trỏ vào khoảng Nếu bạn nhấn phím Tab dịng chứa sẵn đoạn mã, Emacs đẩy lùi đoạn mã vào khoảng Ví dụ bạn gõ vào đoạn mã sau: Int main() { printf (“Hello, world\n”); } Nếu bạn nhấn phím Tab dịng lệnh gọi hàm printf, Emacs định dạng lại đoạn mã bạn thành này: Int main() { printf (“Hello, world\n”); } Khi bạn sử dụng Emacs nhiều hơn, bạn thấy giúp bạn thực tất kiểu định dạng phức tạp Nếu bạn cịn muốn nhiều thế, bạn lập trình cho Emacs thể cách xác kiểu tự động định dạng bạn nghĩ Nhiều người sử dụng tính tiện lợi để bổ sung cho chế độ biên soạn Emacs trở nên đơn giản soạn thảo văn bản, cung cấp phương tiện làm game, bổ sung sở liệu 1.1.3 Làm bật cú pháp Để thêm vào khả định dạng mãn nguồn bạn, Emacs khiến cho việc đọc mã nguồn C C++ trở nên dễ dàng việc sử dụng màu sắc khác cho cú pháp lệnh khác Ví dụ, Emacs chuyển từ khoá thành màu, loại kiểu liệu int màu khác… Sử dụng màu sắc khiến cho việc xác định vị trí lỗi cú pháp trở nên dễ dàng nhiều Cách dễ để bật chế độ đổi màu thay đổi file ~/.emacs thêm vào xâu sau: (global-font-lock-mode t) Lưu file lại, Emacs khởi động lại Emacs Bạn thấy xâu ký tự trông giống đoạn mã ngôn ngữ lập trình LISP Đó xâu ký tự đoạn mã LISP Hầu hết phần mềm Emacs viết ngơn ngữ LISP Bạn thêm chức cho Emacs cách viết thêm mã LISP 1.2 Biên dịch với GCC Một trình biên dịch chuyển mã nguồn từ dạng người đọc sang dạng mã máy để chương trình chạy Tất trình biên dịch sử dụng Linux phần tổng hợp trình biên dịch GNU, thường biết đến với tên gọi GCC GCC bao gồm trình biên dịch cho C, C++, Java, Objective-C, Fortran, Chill Giả sử bạn có dự án Listing 1.2 với file mã nguồn C++ (reciprocal.cpp) file mã nguồn C (main.c) Listing 1.1 Hai file biên dịch liên kết để tạo nên chương trình gọi reciprocal Chương trình tính tốn số nghịch đảo số ngun Listing 1.1 (main.c) C source file - main.c #include #include “reciprocal.hpp” int main (int argc, char **argv) { int i; i = atoi (atgv[1]); printf (“Số nghịch đảo %d %g\n”, i, reciprocal(i)); return 0; } Listing 1.2 (reciprocal.cpp) C++ source file - reciprocal.cpp #include #include ”reciprocal.hpp” double reciprocal (int i) { //i nên khác assert (i != 0); return 1.0/i; } Một file tiêu đề gọi reciprocal.hpp (xem listing 1.3) Listing 1.3 (reciprocal.hpp) Header file - reciprocal.hpp #ifdef cplusplus extern “C” { #endif extern double reciprocal (int i); #ifdef cplusplus } #endif Bước chuyển mã nguồn C C++ thành mã máy 1.2.1 Biên dịch file nguồn Tên trình biên dịch C gcc Để biên dịch file nguồn C, bạn dùng lựa chọn -c Vì vậy, nhập lựa đoạn lệnh sau vào vị trí dấu nhắc trỏ lệnh để biên dịch file main.c: % gcc -c main.c Ta file tên main.o Trình biên dịch cho C++ gọi g++ Quá trình xử lý giống với gcc; việc dịch file reciprocal.cpp hoàn tất với đoạn lệnh sau: % g++ -c reciprocal.cpp Lựa chọn -c báo cho g++ dịch chương trình sang file đối tượng; khơng có lựa chọn đó, g++ thử kết nối chương trình để tạo nên chương trình hồn thiện, chạy Sau bạn gõ lệnh này, bạn có file đối tượng gọi reciprocal.o Tất nhiên bạn cần đến vài lựa chọn khác để xây dựng chương trình lớn Lựa chọn -I dùng để báo cho GCC biết cần tìm file đầu đề đâu Nếu để mặc định, GCC tìm thư mục hành thư mục chứa file tiêu đề thư viện chuẩn cài đặt Nếu bạn cần dùng đến file tiêu đề chỗ khác, bạn cần lựa chọn -I Ví dụ, giả sử dự án bạn có thư mục tên src để chứa file nguồn, thư mục tên include Bạn dịch file reciprocal.cpp sau để định g++ phải sử dụng thư mục /include để tìm file reciprocal.hpp: % g++ -c -I /include reciprocal.cpp Đôi bạn muốn sử dụng macro dịng lệnh Ví dụ như, đoạn mã sản phẩm cuối cùng, bạn không muốn việc kiểm tra thực file reciprocal.cpp; vốn để giúp bạn sửa lỗi chương trình Bạn tắt chức kiểm tra việc dùng macro NDEBUG Bạn thêm #define vào file reciprocal.cpp, cần phải thay đổi mã nguồn Sẽ dễ dàng việc dùng NDEBUG vào dòng lệnh sau: % g++ -c -D NDEBUG reciprocal.cpp Nếu bạn muốn sử dụng NDEBUG với vài giá trị cụ thể, bạn làm sau: % g++ -c -D NDEBUG=3 reciprocal.cpp Nếu bạn thực xây dựng sản phẩm cuối cùng, hẳn bạn muốn GCC tối ưu hố đoạn mã để chạy nhanh hết mức Bạn làm điều việc sử dụng lựa chọn -02 dòng lệnh (GCC có nhiều cấp độ tối ưu khác nhau; cấp độ thứ hai sử dụng cho hầu hết chương trình.) Ví dụ, đoạn lệnh biên dịch file reciprocal.cpp sau có kèm theo lựa chọn tối ưu hố: % g++ -c -02 reciprocal.cpp Chú ý dịch chương trình với chức tối ưu hố làm chương trình bạn khó sửa lỗi trình sửa lỗi (xem phần 1.4, “Sửa lỗi với GDB”) Cũng vậy, trường hợp cụ thể, biên dịch với chức tối ưu hố làm lộ lỗi chương trình bạn mà trước khó phát Bạn dùng nhiều lựa chọn khác với gcc g++ Cách tối để có danh sách hồn chỉnh lựa chọn tìm tài liệu mạng Bạn làm việc cách gõ dịng lệnh sau vào cửa sổ lệnh: % info gcc 1.2.2 Kết nối file đối tượng Bây bạn dịch main.c utilities.cpp, bạn muốn liên kết chúng với Bạn nên dùng g++ để kết nối chương trình chứa mã C++, kể có chứa mã C Nếu chương trình bạn chứa mã C, bạn nên dùng gcc thay g++ Vì chương trình chứa mã C C++, bạn nên sử dụng g++ sau: % g++ -o reciprocal main.o reciprcocal.o Lựa chọn -o khiến tên file tạo thành từ bước kết nối Bây bạn chạy file reciprocal sau: % /reciprocal The reciprocal of is 0.142857 Như bạn thấy, g++ tự động kết nối vào thư viện biên dịch C chuẩn có chứa hàm printf Nếu bạn cần kết nối tới thư viện khác (như công cụ đồ hoạ), bạn phải định thư viện lựa chọn -l Trong Linux, hầu hết tên thư viện bắt đầu lib Ví dụ như, thư viện PAM (Pluggable Authentication Module) gọi libpam.a Để liên kết với thư viện libpam.a, bạn phải sử dụng lệnh sau: % g++ -o reciprocal main.o reciprocal.o -lpam Trình biên dịch tự động thêm phần lib vào đầu phần a vào cuối Với file đầu đề, trình liên kết tìm thư viện chỗ bản, bao gồm thư mục /lib /usr/lib, vốn chứa thư viện chuẩn hệ thống Nếu bạn muốn trình liên kết tìm thư mục khác nữa, bạn nên sử dụng lựa chọn -L, lựa chọn tương đương với lựa chọn -I Bạn sử dụng dịng lệnh để định cho trình liên kết tìm thư viện thư mục /usr/local/lib/pam trước tìm chỗ thơng thường: % g++ -o reciprocal main.o reciprocal.o -L/usr/local/lib/pam -lpam Mặc dù bạn sử dụng lựa chọn -I để khiến chọn trước tìm kiếm thư mục hành, bạn phải sử dụng lựa chọn -L để khiến liên kết tìm thư viện thư mục hành Cụ thể, bạn dùng dịng lệnh sau để định cho trình liên kết tìm thư viện test thư mục hành: % gcc -o app app.o -L -ltest 1.3 Tự động hố q trình xử lý với GNU Make b) Tìm hiểu chút makefile 1.Tổng quan make Công cụ make tự động xác định thành phần chương trình lớn cần phải biên tập lại, đưa câu lệnh để biên tập lại chúng Nó dung nhiều từ lập trình C Linux trở lên phổ biến, bạn sử dụng make với ngơn ngữ lập trình khác mà trình biên dịch chạy với lệnh shell Thực vậy, make không giới hạn chế chương trình Để chuẩn bị sử dụng make bạn cần phải viết file, gọi makefile, dùng để miêu tả mối quan hệ file chương trình cung cấp lệnh cho việc cập nhật file khác Trong chương trình, tập tin thi hành cập nhật từ file object Với makefile có, vào thời điểm khác, bạn thay đổi file mã nguồn câu lệnh shell đơn giản: Make đủ để thi hành tất thay đổi biên tập lệnh Chương trình Make sử dụng sở liệu makefile giảm thiểu thời gian cho việc cập nhật file.Với file này, đưa dòng lệnh ghi lại sở liệu 2.Giới thiệu makefile Bạn cần file gọi makefile để lệnh cho make phải làm Makefile báo cho make biết làm để biên dịch kết nối chương trình Khi make biên dịch lại trình soạn thảo, file mã nguồn bị biên tập lại Nếu tiêu để file thay đổi file mã nguồn bao gồm tiêu đề file phải biên dịch lại để an toàn Mỗi sản phẩm sau biên dịch tương ứng với file mã nguồn Cuối cùng, file mã nguồn biên dịch lại, tất object file file viết ra, lưu lại trình biên dịch trước phải liên kết với để sản xuất trình biên soạn thực thi 3.Một makefile đơn giản Đây makefile đơn giản dễ hiểu mô tả cách tập tin thi hành gọi edit phụ thuộc vào tám file object mà phụ thuộc vào tám file mã nguồn C ba file tiêu đề (header) Trong ví dụ này, tất file C bao gồm defs.h, lệnh định nghĩa biên soạn sử dụng thư viện command.h, file cấp độ thấp mà có thay đổi buffer trình biên dịch sử dụng thư viện buffer.h edit : main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o cc -o edit main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o main.o : main.c defs.h cc -c main.c kbd.o : kbd.c defs.h command.h cc -c kbd.c command.o : command.c defs.h command.h cc -c command.c display.o : display.c defs.h buffer.h cc -c display.c insert.o : insert.c defs.h buffer.h cc -c insert.c search.o : search.c defs.h buffer.h cc -c search.c files.o : files.c defs.h buffer.h command.h cc -c files.c utils.o : utils.c defs.h cc -c utils.c clean : rm edit main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o Chúng ta chia cắt dòng lệnh dài dấu “\” để dễ nhìn Sử dụng makefile để tạo tập tin thi hành gọi edit, gõ: Make Để sử dụng makefile để xoá tập tin thi hành tất object file từ thư mục, gõ: make clean Trong ví dụ makefile, đích (target) bao gồm tập tin thi hành `edit', object file `main.o' `kbd.o' Không thể thiếu file `main.c' and `defs.h' Trong thực tế, file `.o' bao gồm target phần Những dịng lệnh bao gồm : `cc -c main.c' `cc -c kbd.c' Khi target file, cần biên tập lại kết nối số phần thay đổi Cần bổ sung them, phần tạo nó, nên cập nhật trước Ví dụ, edit phụ thuộc vào tám file object file tiêu đề (header file) defs.h Một lệnh shell viết dịng chứa target phần Những lệnh shell cho biết làm thé để cập nhật target file Ký tự tab phải có dịng lệnh nhận dòng lệnh từ dòng khác makefile Target `clean' file, đơn tên hành động.bạn không muốn thực hành động rule (quy tắc) này, `clean' phần rule khác Do đó, make khơng thực điều trừ bạn lệnh rõ ràng cho Chú ý rule khơng phải phần chính, có mục đích chạy lệnh rõ rang 4.Make xử lý makefile nào? Theo mặc định, make bắt đầu với target (khơng có tên target bắt đầu `.') Nó gọi default goal (Goal taget mà make cố gắng cập nhật Bạn ghi đè tính chất cách sử dụng dòng lệnh với biến đặc biệt DEFAULT_GOAL ) Trong ví dụ trên, default goal cập nhật chương trình edit; vậy, đưa rule Vì thế, bạn đưa dịng lệnh : make Make đọc makefile thư mục anh bắt đầu xử lý rule Trong ví dụ, rule lien kết lại edit trước make xử lý hồn tồn rule này, phải xử lý rule cho file mà edit phụ thuộc, trường hợp file object Mỗi file đựơc xử lý theo rule riêng Những rule cho phép cập nhật file `.o' cách biên dịch file mã nguồn Sự biên tập lại phải làm file mã nguồn file tiêu đề có tên giống với phần Các rule khác xử lý target chúng xuất thành phần goal Nếu rule khác khơng phụ thuộc vào goal, rule khơng xử lý, trừ bạn lệnh cho make thực Trước biên dịch lại mọt file object, make coi việc cập nhật việc bắt buộc, file mã nguồn file tiêu đề Makefile không định rõ điều làm cho chúng, file `.c' `.h' không target rule nào, nên make khơng thực điều cho chúng Nhưng make tự động cập nhật chương trình C tạo Sauk hi biên dịch lại file object cần thiết, make định xem có hay không liên kết lại edit Việc phải làm file edit không tồn tại, có file object Nếu object file biên dịch lại, edit , nên edit liên kết lại Vì vậy, thay đổi file insert.c chạy make, make biên dịch file để cập nhật insert.o, sau liên kết edit Nếu ta thay đổi file command.h chạy make, make biên dịch lại file object kbd.o, command.o files.o kết nối với file edit 5.Quy tắc viết makefile Một makefile đơn giản có gồm quy tắc (rules): Target …: prerequisites command Target : thường tên file sinh chương trình , ví dụ target object file Target tên hành động thực thi, ví dụ “clean” Prerequisites: file sử dụng liệu vào để tạo Target Một Target thường phụ thuộc vào vài file khác Command: hành động mà make thực thi Một quy tắc có lệnh viết dòng riêng biệt Chú ý: viết bạn cần cách tab từ đầu dòng cho mõi dòng lệnh để tránh gây nhầm lẫn Thơng thường, dịng lệnh quy tắc điều bắt buộc phục vụ cho việc tao Target file Một quy tắc (rule) giải thích làm làm lại (remake) file đó, mà Target rule khác Make thực thi lệnh điều kiện để tạo cập nhật Target Một rule giải thích làm thực thi hành động Một makefile chứa văn khơng nằm rule, makefile đơn giản cần chứa rule 5.1 Nội dung makefile Makefile bao gồm:  Quy tắc rõ ràng (explicit rule) : nói làm để làm lại file Gọi đến target rule Nó ghi vào danh sách file mà Target phụ thuộc vào, gọi đến Prerequisites target đưa lệnh để tạo cập nhật target  Quy tắc tuyệt đối (implicit rule): định làm thé để làm lại lớp file vào tên chúng Nó mơ tả làm target phụ thuộc vào file với tên tương tự target đưa lệnh để tạo cập nhật target  Định nghĩa biến số (variable definition) : dòng định rõ giá trị chuỗi văn cho biến số mà thay bên văn sau Một ví dụ Makefile đơn giản đưa định nghĩa biến số cho object danh sách tất object file  Sự dẫn (directive) : lệnh cho make thực việc đặc biệt đọc makefile Nó bao gồm:  Đọc makefile khác  Quyết định xem sử dụng hay bỏ qua phần makefile  Định nghĩa biến từ chuỗi nguyên văn chứa nội dung gồm nhiều dòng  Trong phạm vi tập lệnh (Nếu dòng bắt đầu với ký tự TAB) tồn dịng bị bỏ qua shell, với dòng khác bắt đầu với TAB Shell định làm thé để dịch văn  Trong phạm vi dẫn định nghĩa, lời ý (comments) không bị bỏ qua trình định nghĩa biến số, giữ cho không bị thay đổi giá trị biến số Trong biến số mở rộng, chúng ưu tiên make lời ý văn tập lệnh, phụ thuộc vào ngữ cảnh mà biến số định danh 5.2 Đặt tên cho makefile Theo mặc định, make tìm kiếm makefile, theo dõi tên makefile hợp lệ : GNUmakefile, makefile Makefile Thông thường, bạn gọi makefile makefile Makefile Tên kiểm tra GNUmakefile, khơng đề nghị cho tất makefile Bạn nên sử dụng tên bạn có makefile riêng biệt GNU make khơng thể hiểu phiên make khác Các chương trình make khác tìm kiếm makefile Makefile khơng tìm GNUmakefile Nếu make khơng tìm thấy tên tên trên, khơng sử dụng makefile Bạn phải định rõ mục tiêu với đối số lệnh, make cố gắng đoán nhận làm thé để làm lại sử dụng với rule chuẩn cài đặt sẵn Nếu bạn không muốn sử dụng tên chuẩn cho makefile, bạn rõ tên makefile với tuỳ chọn : `-f' ` file' Đối số `-f' ` file' yêu cầu make hiểu file name giống makefile Tất makefile móc nối với theo xếp định Với tên mặc định makefile GNUmakefile, makefile Makefile không bị kiểm tra tự động bạn định rõ `-f' ` file' 5.3 Including Other Makefile Include dẫn lệnh make hoãn đọc makefile nhiều makefile khác trước tiếp tục Chỉ dẫn dòng makefile có dạng : include filenames … filenames chứa nội dung tên file shell filenames trống, khơng có lỗi đựoc in ra.Khơng gian them chấp nhận bỏ qua đầu dòng ký tự tab khơng chấp nhận Whitespace u cầu include tên file Whitespace them bỏ qua kết thúc phần hướng dẫn Một thích (comment ) bắt đầu dấu “#” cho phép vị trí kết thúc dịng Nếu file name chứa biến hàm tham chiếu, chúng mở rộng Ví dụ, bạn có file mk a.mk, b.mk c.mk phần mở rộng $(bar) tới bish bash , theo dõi biểu thức sau: include foo *.mk $(bar) Nó tương đương với: include foo a.mk b.mk c.mk bish bash lý include dẫn, dừng việc đọc nội dung Khi make xử makefile đọc luân phiên từ danh sách file Khi hoàn thành, make tiếp tục đọc makefile dẫn xuất Một lý để sử dụng include dẫn vài chương trình điều khiển makefile riêng lẻ thư mục khác nhau, cần sử dụng định nghĩa biến rule mẫu Nếu bạn muốn make bỏ qua hồn tồn makefile khơng tồn khơng thể đựoc viết lại, với khơng có dịng thơng báo, sử dụng –include dẫn include,tương tự: -include filenames Hành động giống include cách loại khơng có sai sót filenames không tồn Để phù hợp với vài make bổ sung, sinclude tên khác cho –include 5.4 Biến Makefiles Nếu môi trường Biến makefiles định nghĩa, make coi giá trị danh sách tên makefile thêm để đọc trước biến khác Công việc giống với include dẫn: thư mục khác tìm kiếm cho file Trong phép cộng, mục tiêu mặc định không ghi lại từ makefile khơng có lỗi file ghi vào danh sách makefiles không tìm thấy Mục đích Makefile giao tiếp lời gọi đệ quy make Nó khơng khuyến khích dung để bố trí mơi trường biến trước bước đầu lời gọi make gây lên hỗn độn với makefile bên Tuy nhiên, bạn chạy make mà khơng có makefile đặc trưng makefile MAKEFILES sử dụng để giúp việc rule cài đặt sẵn làm vịêc tốt 5.5 Biến MAKEFILE_LIST Vì make đọc makefile khác nhau, bao gồm thu từ biến MAKEFILES dòng lệnh, files mặc định, từ include dẫn, tên chúng tự động đựơc bổ sung vào biến MAKEFILE_LIST Chúng đựơc them vào trước make phân tách chúng , Nghĩa điều makefile làm xem xét từ biến này, tên makefile Makefile sử dụng include , nhiên, từ included xác cho makefile Nếu makefile đặt tên Makefile có nội dung là: name1 := $(lastword $(MAKEFILE_LIST)) include inc.mk name2 := $(lastword $(MAKEFILE_LIST)) all: @echo name1 = $(name1) @echo name2 = $(name2) Sau bạn chờ để đưa ra: name1 = Makefile name2 = inc.mk 5.6 Một số loại biến khác GNU make hỗ trợ số biến đặc biệt khác Trừ tài liệu đây, giá trị thuộc tính chúng thiết lập makefile dòng lệnh .DEFAULT_GOAL : sử dụng khơng có target định danh dịng lệnh Biến default_goal cho phép bạn tìm mục tiêu mặc định hiên tại, khởi động lại thuật toán lựa chọn mục tiêu mặc định cách xoá giá trị chúng, thiết lập rõ rang mục tiêu mặc định Ví dụ: # Query the default goal ifeq ($(.DEFAULT_GOAL),) $(warning no default goal is set) endif PHONY: foo foo: ; @echo $@ $(warning default goal is $(.DEFAULT_GOAL)) # Reset the default goal .DEFAULT_GOAL := PHONY: bar bar: ; @echo $@ $(warning default goal is $(.DEFAULT_GOAL)) # Set our own .DEFAULT_GOAL := foo Makefile in ra: no default goal is set ... định dạng hệ thống tập tin khác Linux hỗ trợ số lượng lớn định dạng hệ thống tập tin, bao gồm hệ thống tập tin DOS OS/2, hệ thống tập tin mới, reiserfs, HFS, Trong hệ thống tập tin Linux, gọi... makefile để tạo tập tin thi hành gọi edit, gõ: Make Để sử dụng makefile để xoá tập tin thi hành tất object file từ thư mục, gõ: make clean Trong ví dụ makefile, đích (target) bao gồm tập tin thi... quan make Công cụ make tự động xác định thành phần chương trình lớn cần phải biên tập lại, đưa câu lệnh để biên tập lại chúng Nó dung nhiều từ lập trình C Linux trở lên phổ biến, bạn sử dụng make

Ngày đăng: 13/03/2023, 08:03

Tài liệu cùng người dùng

Tài liệu liên quan