Sự khác nhau cơ bản giữa lập trình C++ trong Linux và Windows doc

21 2.1K 7
Sự khác nhau cơ bản giữa lập trình C++ trong Linux và Windows 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

Trường Đại Học Tôn Đức Thắng Khoa CNTT – TUD Group: Hell’s Boy ĐỀ ÁN GIỮA HỌC KỲ SỰ KHÁC NHAU GIỮA C++ TRÊN WINDOWS VÀ LINUX I - Giới thiệu sơ lược: Linux là hệ điều hành nguồn mở. Tức là Linux giống như Windows ở chỗ nó là cái nền quản lý mọi thứ khi bạn sử dụng máy tính. Nó quản lý các ứng dụng đang chạy, quản lý những thông tin về người dùng, quản lý dữ liệu trên đĩa cứng… Ngoài ra nó còn cung cấp cho các chương trình phần mềm những tài nguyên để chúng có thể chạy được. Chính vì thế một phần mềm được viết ra để chạy trên hệ điều hành này sẽ không thể (thông thường là thế) chạy trên hệ điều hành khác. Muốn chạy được thì lập trình viên phải viết một phiên bản riêng dành cho hệ điều hành cần thiết. Đó chính là lý do vì sao người dùng Linux gặp trở ngại trong làm việc, vì hầu hết những phần mềm cao cấp đắt tiền như Office, CorelDraw, Adobe các loại… không có phiên bản chạy trên Linux. Tuy nhiên, may mắn là thế giới phần mềm nguồn mở lại luôn có sẵn những phần mềm cho Linux, mặc dù chúng có thể chưa so sánh được với những phần mềm nguồn đóng đắt tiền kia, nhưng hoàn toàn phù hợp cho nhu cầu hàng ngày. Trình biên dịch C trên Linux chỉ là một phần GCC (GNU Compiler Collection). GCC có thể dùng được với: C, C++, Objective C, Fortran,… Biên dịch C là "gcc" Biên dịch C++ là "g++". Bộ công cụ phát triển ứng dụng GNU * GNU Compiler Collection (GCC) + Thư việncác hàm tiện ích: libc, libstdc++, … + Các trình biên dịch gcc, g++, gcj, gas, … + Trình khử lỗigdb +Trình tiện ích khác trong binutils như nm, strip, ar, objdump, ranlib (dùng lệnh info binutils để xem thêm) Tiệních: gmake… Sơ lược về hoạt động của g++ trong linux Ngôn Ngữ Lập Trình – 07 TH 3D 1 Trường Đại Học Tôn Đức Thắng Khoa CNTT – TUD Group: Hell’s Boy Trình soạn thảo code và cách thức biên dịch C++ trong linux Biên Biên dịch dịch chương chương trì trì nh nh C/C++ C/C++ *Biên d ịch (không link) file chươ ng trình ngu ồ n C++ Vd: 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 f ile *.h trong t h ư m ục include/ (dùng t ù y chọ n -I để chỉ đị nh đườ ng d ẫ n) Vd: g++ -c -I /incl ude reciprocal.c +Biên d ịch (không link) có tố i ư u mã Vd: g++ -c -O2 main.c + Biên d ịch có kèm t hông tin ph ục vụ debug => kích th ước f il e output l ớ n Vd: g++ -g reciprocal.c *Liên kết (link) nhiều file đối tượng (object files) đã có Vd: g++ -o myapp main.o reciprocal.o *Giả sử ứng dụng của bạn gồm nhiều hơn một file source code, e.g main.c và reciprocal.c. Để tạo thành chương trình thực thi, bạn có thể biên dịch trực tiếp bằng một lệnh g++ như sau: Vd: g++ -o myapp main.c reciprocal.c Cách làm thủ công như trên sẽ bất tiện và không hiệu quả khi ứng dụng gồm quá nhiều file. Ngôn Ngữ Lập Trình – 07 TH 3D 2 Trường Đại Học Tôn Đức Thắng Khoa CNTT – TUD Group: Hell’s Boy Trong Windows: Ngôn Ngữ Lập Trình – 07 TH 3D 3 Trường Đại Học Tôn Đức Thắng Khoa CNTT – TUD Group: Hell’s Boy Trong windows thi sau khi viết xong đoạn code cho chương trình thì ta chỉ cần nhấn những tổ hợp phím: +F7: Biên dịch chương trình. +Ctrl F5: Để chạy file thực thi. +Shift F5: Để chạy debug. Trong Trường hợp đoạn code bi lỗi thi sau khi nhấn F7 chương trinh sẽ báo lỗi cho ta.Khi đó thì ta nhấn phím F4 để biết được đoạn code của ta bị lỗi gì và ở đâu. II. Cách khai báo thư viện: Thư viện: cả hai đều có thư viện lệnh chuẩn như: string.h,stdio.h…… Tuy nhiên trong đó thư viện dùng để khai báo hàm nhập và xuất(hàm iostream.h trong windows và iostream trong linux. Xem hình minh họa bên dưới) của của windows và linux lại khác nhau.Một cách chính xác là cách khai báo trong linux cũng có thể dùng trong windows được. Trong Linux không sử dụng thư viện lệnh <conio.h> nhưng thay vào đó lại là lệnh<curses.h> #include <thu vien lenh> Vd: #include <iostream.h> Các câu bắt đầu bằng dấu (#) được dùng cho preprocessor . Chúng không phải là những dòng mã thực hiện nhưng được dùng để báo hiệu cho trình dịch. Ở đây câu lệnh #include <iostream.h> báo cho trình dịch biết cần phải "include" thư viện iostream. Đây là một thư viện vào ra cơ bản trong C++ và nó phải được "include" vì nó sẽ được dùng trong chương trình. Đây là cách cổ điển để sử dụng thư viện iostream Void main () hay int main () Dòng này tương ứng với phần bắt đầu khai báo hàm main. Hàm main là điểm mà tất cả các chương trình C++ bắt đầu thực hiện. Nó không phụ thuộc vào vị trí của hàm này (ở đầu, cuối hay ở giữa của mã nguồn) mà nội dung của nó luôn được thực hiện đầu tiên khi chương trình bắt đầu. Thêm vào đó, do nguyên nhân nói trên, mọi chương trình C++ đều phải tồn tại một hàm main. Theo sau main là một cặp ngoặc đơn bởi vì nó là một hàm. Trong C++, tất cả các hàm mà sau đó là một cặp ngoặc đơn () thì có nghĩa là nó có thể có hoặc không có tham số (không bắt buộc). Nội dung của hàm main tiếp ngay sau phần khai báo chính thức được bao trong các ngoặc nhọn ( { } ) như trong ví dụ của chúng ta . Ngôn Ngữ Lập Trình – 07 TH 3D 4 Trường Đại Học Tôn Đức Thắng Khoa CNTT – TUD Group: Hell’s Boy Trong windows: Trong linux: Windows: 1. MFC (Microsoft Foundation Class) Thư viện MFC (Microsoft Foundation Class) là thư viện tập hợp các lớp hướng đối tượng đóng gói các hàm API của Windows và các kiểu dữ liệu đặc biệt. Bên cạnh sử dụng thư viện MFC trong Visual C++ 6.0, chúng ta có thể sử dụng các hàm C chuẩn 2. MSDN (Microsoft Developer Network) Trong MSDN, ngoài các tài liệu giới thiệu chi tiết về việc sử dụng những hàm,lớp…, còn có các quyển sách, bài báo kỹ thuật, hay các mẫu code có thể được tận dụng trong việc lập trình. Linux: 1. Static libraries: Tên thường có "lib" và mở rộng ".a" Ngôn Ngữ Lập Trình – 07 TH 3D 5 Trường Đại Học Tôn Đức Thắng Khoa CNTT – TUD Group: Hell’s Boy Ví dụ: libmyprog.a 2. Shared libraries: Tên có "lib" và phần mở rộng ".so" Ví dụ: libmyprog.so Trước khi được sử dụng thì thư viện phải được cài đặt. Việc cài đặt thư viện gần như rất dễ dàng và đơn giản với người đã từng sử dụng Linux. Các thư viện có thể nên cài vào máy là: ncurses, SVGALib và ngoài ra có thể sử dụng các đồ họa cấp cao như GTK/Qt/FLTK thậm chí trực tiếp với X. + Archives ( s tatic library) Là tập hợp các file object tạo thành một file đơn nhất Tương tự file .LIB trên Windows Khi bạn chỉ định liên kết ứng dụng của mình với một static library thì linker sẽ tìm trong thư viện đó để trích xuất những file object mà bạn cần. Sau đó, linker sẽ tiến hành liên kết các file object đó vào chương trình của bạn. Cách th ức tạ o t h ư vi ệ n tĩ nh (archive file) Giả sử bạn có hai file mã nguồn chứa hàm là a.c và b.c a.c b.c int func1(){ double func2(){ return 7; return 3.14159; } } T ạ o t h ư vi ệ n tĩ nh tên là libab.a 1. Biên dịch tạo các file object $ gcc -c a.c b.c 2. Dùng lệnh ar để tạo thành thư viện tĩnh tên là libab.a $ ar cr libab.a a.o b.o 3. Có thể dùng lệnh nm để xem lại kết quả $ nm libab.a 4. Có thể dùng lệnh file để xem file libab.a là loại file gì $ file libab.a Tạo ứng dụng đơn giản có sử dụng hàm thư viện trong a.c Vidu: Tên file là myapp.c int main() { cout<<”Ket qua dung ham func1:”<<func1; cout<<endl; exit(0); } Biên dịch không có link thư viện tĩnh libab.a $ gcc myapp.c /tmp/cc2dMic1.o: In function `main': Ngôn Ngữ Lập Trình – 07 TH 3D 6 Trường Đại Học Tôn Đức Thắng Khoa CNTT – TUD Group: Hell’s Boy /tmp/cc2dMic1.o(.text+0x7): undefined reference to `func1' collect2: ld returned 1 exit status Biên dịch có link đến thư viện tĩnh libab.a $ gcc -o myapp myapp.c -L. -lab hoặc gcc -o myapp myapp.c libab.a $ ./myapp Kết quả dùng hàm func1: 7 Thư viện liên kết động (dynamic, shared library) Tương tự thư viện dạng .DLL của Windows Thư mục chứa thư viện chuẩn +/usr/lib, /lib Tạo thư viện liên kết động libab.so từ a.c và b.c 1. Biên dịch tạo các file object có dùng tùy chọn -fPIC $ g++ -c -fPIC a.c b.c 2. Tạo thư viện liên kết động tên là libab.so $ g++ -shared -fPIC -o libab.so a.o b.o 3. Có thể dùng lệnh file để xem file libab.so là loại file gì $ file libab.so Note:libab.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), not stripped. Tạo ứng dụng với file myapp.c như ví dụ trước Biên dịch link với thư viện tĩnh libab.so $ g++ myapp.c Biên dịch có link đến thư viện tĩnh libab.a G++ -o myapp myapp.c libab.so ./myapp Thông báo lỗi:./myapp: error while loading shared libraries: libab.so: cannot open shared object file: No such file or directory Tại sao??? Nguyên nhân: do loader tìm trong thư mục thư viện chuẩn như /usr/lib, /lib không có libab.so Cách giải quyết (cũng là cách dùng để triển khai - deploy, một ứng dụng có sử dụng thư viện liên kết động) 1. Nếu có đủ quyền hạn (e.g. root) thì copy các file thư viện chia sẻ và thư mục chuẩn # cp libab.so /lib ./myapp Kết quả dùng hàm func1: 7 Ngôn Ngữ Lập Trình – 07 TH 3D 7 Trường Đại Học Tôn Đức Thắng Khoa CNTT – TUD Group: Hell’s Boy 2. Nếu không có đủ quyền hạn copy file vào thư mục chuẩn, user phải thay đổi biến môi trường LD_LIBRARY_PATH để chỉ cho loader tìm trong thư mục chứa thư viện. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. ./myapp Kết quả dùng hàm func1: 7 Một số chú ý khi lập trình với thư viện liên kết động. Kiểm tra xem ứng dụng cuối cùng của mình tạo ra phụ thuộc vào các thư viện liên kết động nào bằng lệnh ldd. Nếu bị thiếu thư viện thì phải khắc phục theo 2 cách ở trên. $ ldd myapp Thông báo: libab.so => not found libc.so.6 => /lib/i686/libc.so.6 (0x42000000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) Trong thư mục hiện tại có 2 thư viện là libab.a và libab.so. Khi đó, linker sẽ ưu tiên liên kết thư viện .so trước. Muốn chỉ định buộc linker tiến hành liên kết tĩnh với thư viện libab.a thì thêm tùy chọn -static $ mv libab.so libab.so.old $ gcc -static -o myapp myapp.c -L. -lab $ ./myapp Kết quả dùng hàm func1: 7 Ngôn Ngữ Lập Trình – 07 TH 3D 8 Trường Đại Học Tôn Đức Thắng Khoa CNTT – TUD Group: Hell’s Boy Cách viết thân hàm: Cách viết trong windows cách viết trong linux III – Cách sử dụng: Windows: Workspace Đây là không gian tương tác giúp lập trình viên nhanh chóng chuyển qua lại giữa các lớp, các tập tin hay các tài nguyên trong project. (Tắt/ Mở workspace : Alt + 0 hoặc View/Workspace) Workspace gồm có 3 tab chính (có thể có các tab phụ add-in): ClassView, ResourceView, FileView. Nội dung các tab này được thể hiện ở dạng cây có thể mở rộng, thu hẹp thông qua các nút +, ClassView cho thấy hình ảnh tổng thể project dưới dạng các lớp. Trong classview, lập trình viên có thể Ngôn Ngữ Lập Trình – 07 TH 3D 9 Trường Đại Học Tôn Đức Thắng Khoa CNTT – TUD Group: Hell’s Boy biết được cấu tạo của một lớp (có những hàm, biến nào; tầm vực hoạt động của các hàm, các biến – public, protected, private). ResourceView cho thấy được những tài nguyên có trong project (dialog, menu, toolbar, bitmap, icon, …). Thực chất đây là phần hiện thực hoá những gì thể hiện trong tập tin resource.h và .rc FileView cho thấy những tập tin có trong project :source file, header file, resoure file và những tập tin được thêm vào sau. Đó là vùng dùng để thiết kế giao diện (các dialog, menu, toolbar) hay viết code cho project. Output Vùng thể hiện các thông báo lỗi (nếu có), các kết quả thực thi (khi có sử dụng Macro), nội dung của biến (ở chế độ Debug) … Ngôn Ngữ Lập Trình – 07 TH 3D 10 [...]... trình của bạn vẫn được biên dịch ra mã nhị phân và chạy như một chương trình bình thường Tuy nhiên, trình biên dịch sẽ thêm một số thông tin để trình bắt lỗi debugger có thể dựa vào đó hướng dẫn và thực thi chương trình theo yêu cầu tương tác của bạn Một chương trình nhị phân muốn thêm vào các thông tin gỡ lỗi, bạn biên dịch với tùy chọn là –g (đối với trình biên dịch là gcc) Chúng ta sẽ xử dụng trình. .. này là do quá trình chúng ta truy xuất vào các phần tử không có trên mảng Tùy theo các phiên bản khác nhau của Linux và Unix thì có thể cho ra một thông báo lỗi khác nhau Do hệ điều hành luôn cấp phát một vùng nhớ dư cho một ứng dụng nào đó nên ở đây tại vị trí của phần tử thứ 2 thì có kết quả (null) Nếu như bây giờ ta sửa lại đoạn chương trình nguồn thì nó sẽ kết xuất ra một thông báo lỗi khác typedef... trình, lập trình viên xác định một control bằng một tên duy nhất (tốt nhất thể hiện BẰNG CHỮ IN HOA) Có thể xem định nghĩa của các ID gắn với một tên của control trong tập tin resource.h Sự kiện: Trên Windows, các sự kiện xảy ra liên tục (khi có một tác động của người dùng, hay của Ngôn Ngữ Lập Trình – 07TH3D 11 Trường Đại Học Tôn Đức Thắng Khoa CNTT – TUD Group: Hell’s Boy chương trình lên hệ thống) Windows. .. chương trình sai với ý tưởng của người dùng Do đó mà trước khi bắt tay vào lập trình (hay thiết kế) bạn cần phải hiểu rõ mục đích mà chương trình mình phải thực hiện là gì • Lỗi thiết kế : Chương trình cho dù kích thước nhỏ đi chăng nữa thì cũng cần phải thiết kế Thường thì ít có chương trình nào bắt đầu bằng việc bạn ngồi ngay vào máy gõ lệnh và thế là nó chạy tốt Hãy dành thời gian để nghĩ xem chương trình. .. khi bạn gõ lệnh này, 1 trong 2 điều sẽ xảy ra Hoặc là mã nguồn của bạn sẽ được thi hành mà không có lỗi và biểu diễn ra màn hình rồi trở lại dấu nhắc lệnh : Hoặc mã của bạn sẽ có một vài lỗi trong đó và các lỗi sẽ được hiển thị: Ngôn Ngữ Lập Trình – 07TH3D 13 Trường Đại Học Tôn Đức Thắng Khoa CNTT – TUD Group: Hell’s Boy Trong đó không có trường hợp tập tin không thi hành được và bạn sẽ được đưa trở... cho các sự kiện (lên chương trình hay lên một control cụ thể) (Phím tắt : Ctrl – W Ở chế độ thiết kế dialog có thể nhấn phím chuột phải và chọn mục ClassWizard trên menu.) Trên hộp thoại MFC ClassWizard, có thể chọn lựa lớp (trong Class name), ID của đối tượng (Object IDs) cần thêm sự kiện vào (Messages) Sau khi chọn Add Functions, môi trường lập trình sẽ tự động thêm khai báo hàm, cấu trúc hàm vào những... logiccủa chương trình Ví dụ những vòng lặp vô tận không có điều kiện thoát, những lỗi đánh chỉ số mảng vượt quá phạm vi cho phép Quá trình gỡ lỗi một chương trình có thể được thực hiện bằng cách theo dõi quá trình hoạt động Ngôn Ngữ Lập Trình – 07TH3D 17 Trường Đại Học Tôn Đức Thắng Khoa CNTT – TUD Group: Hell’s Boy của chương trình bằng các công cụ tự động Thường các trình debugger kèm theo trình biên... tập tin CPP và H của lớp Vùng màn hình Context cho biết giá trị của các biến có trong đoạn chương trình đang chạy (kiểm lỗi) Các biến này được đưa vào một cách tự động Vùng màn hình Watch cho biết giá trị của các biến do lập trình viên mong muốn Vùng màn hình Call Stack cho biết thứ tự gọi hàm của chương trình Vùng màn hình Registers cho biết giá trị các thanh ghi LINUX: Nếu sử dụng C /C++ chuẩn thì... C /C++ chuẩn thì cũng như trên windows, sử dụng ubuntu trước tiên bạn phải cài thêm 2 gói là libstdc++-dev và build essential (vì ubuntu chỉ có các gói cơ bản không hỗ trợ cho lập trình) Để cài đặt mở console gõ lệnh: sudo apt-get install libstdc++-dev sudo apt-get install build-essential Sau khi cài 2 gói này bạn có thể bắt đầu Sử dụng editor có sẵn là gedit, soạn thảo chương trình của bạn, lưu với *.c/*.cpp... bằng tên chương trình đích mainpro Các dòng tiếp theo định nghĩa mối liên quan để tạo ra các tệp mã máy, ví dụ stack.o sẽ phụ thuộc vào stack.cpp và stack.h, nếu một trong các tệp này thay đổi thì stack.o sẽ được tạo lại Biên dịch: Dòng lệnh: make Có thể dùng chung một makefile cho nhiều phần mềm khác nhau, khi đó bạn phải chạy make với tham số là tên chương trình, ví dụ: make mainpro Lập Trình Nâng Cao . TUD Group: Hell’s Boy ĐỀ ÁN GIỮA HỌC KỲ SỰ KHÁC NHAU GIỮA C++ TRÊN WINDOWS VÀ LINUX I - Giới thiệu sơ lược: Linux là hệ điều hành nguồn mở. Tức là Linux giống như Windows ở chỗ nó là cái nền. Tuy nhiên trong đó thư viện dùng để khai báo hàm nhập và xuất(hàm iostream.h trong windows và iostream trong linux. Xem hình minh họa bên dưới) của của windows và linux lại khác nhau. Một cách. động của g++ trong linux Ngôn Ngữ Lập Trình – 07 TH 3D 1 Trường Đại Học Tôn Đức Thắng Khoa CNTT – TUD Group: Hell’s Boy Trình soạn thảo code và cách thức biên dịch C++ trong linux Biên Biên

Ngày đăng: 31/07/2014, 09:20

Từ khóa liên quan

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

Tài liệu liên quan