Ngôn ngữ lập trình C

Cài đặt và cấu hình môi trường lập trình C

Bài học trước, chúng ta đã tìm hiểu về tính phụ thuộc vào nền tảng của ngôn ngữ C. Trong thực tế, có nhiều yếu tố ảnh hưởng đến việc lựa chọn môi trường phát triển phù hợp. Trong phạm vi của khóa học này, các ví dụ minh họa sẽ được viết, biên dịch và thực thi dựa trên môi trường trình bày dưới đây.

  1. Kiến trúc vi xử lý x86(64 bit)

    x86 là một kiến trúc tập lệnh (Instruction Set Architecture – ISA) ban đầu do Intel phát triển và hiện nay được sử dụng rộng rãi trên hầu hết các máy tính cá nhân và máy chủ. Kiến trúc này quy định tập lệnh, hệ thống thanh ghi và mô hình địa chỉ, qua đó ảnh hưởng trực tiếp đến quá trình biên dịch và thực thi chương trình.

  2. Hệ điều hành Microsoft Windows 11

    Hệ điều hành là phần mềm hệ thống đóng vai trò trung gian giữa người dùng, ứng dụng và phần cứng. Hệ điều hành quản lý tài nguyên hệ thống (CPU, bộ nhớ, thiết bị I/O) và cung cấp môi trường để các chương trình C đã được biên dịch có thể thực thi.

  3. Trình soạn thảo mã nguồn Visual Studio Code

    Visual Studio Code là trình soạn thảo mã nguồn, cung cấp các tính năng như tô màu cú pháp và gợi ý mã. Công cụ này hỗ trợ tích hợp trình biên dịch, gỡ lỗi và terminal, giúp phát triển và chạy chương trình. Tham khảo Hướng dẫn cài đặt Visual Studio Code.

  4. Toolchain MinGW-w64

    MinGW-w64 là một toolchain dựa trên GNU, được thiết kế để phát triển các chương trình C/C++ trên hệ điều hành Microsoft Windows. Toolchain này là một tập hợp các thành phần, trong đó mỗi thành phần đảm nhiệm một vai trò cụ thể trong quá trình biên dịch, liên kết và tạo tập tin thực thi.

    1. Trình biên dịch gcc

      GCC (GNU Compiler Collection) là trình biên dịch mã nguồn mở thuộc dự án GNU, có nhiệm vụ biên dịch mã nguồn thành mã đối tượng, sau đó kết hợp với trình liên kết để tạo ra tập tin thực thi phù hợp với kiến trúc CPU và hệ điều hành.

    2. Trình liên kết

      Trình liên kết (linker) có nhiệm vụ kết hợp các mã đối tượng và thư viện để tạo ra tập tin thực thi hoàn chỉnh. Trong quá trình này, trình liên kết xác định và ánh xạ các tên hàm và tên biến tới các địa chỉ bộ nhớ tương ứng.

    3. Trình gỡ lỗi gdb

      GDB (GNU Debugger) là trình gỡ lỗi mã nguồn mở thuộc dự án GNU, có nhiệm vụ hỗ trợ kiểm tra và phân tích quá trình thực thi của chương trình. GDB cho phép theo dõi luồng thực thi, dừng chương trình tại các điểm xác định, kiểm tra giá trị của biến và trạng thái bộ nhớ, từ đó giúp phát hiện và sửa lỗi trong quá trình phát triển.

    4. Cài đặt MinGW-w64

      Tải WinLibs từ trang phân phối chính thức hoặc theo liên kết WinLibs.

      Sau khi tải về, giải nén tập tin, sao chép thư mục mingw64 vào một thư mục trên hệ thống, ví dụ là C:\winlibs.

      Thiết lập biến môi trường.

      • Mở cửa sổ Run (Nhấn tổ hợp phím Windows + R), nhập lệnh sysdm.cpl, sau đó nhấn Enter.
      • Chọn thẻ Advanced, nhấp Environment Variables...
      • Trong phần System variables, tìm biến Path và nhấp Edit...
      • Nhấp New và thêm dòng C:\winlibs\mingw64\bin (đây là đường dẫn tới thư mục chứa WinLibs).
      • Nhấp OK để lưu các thiết lập.
  5. Cài đặt C/C++ (Microsoft) extension

    C/C++ (Microsoft) là extension chính thức của Microsoft dành cho Visual Studio Code để hỗ trợ lập trình C và C++. Extension này cung cấp các tính năng như gợi ý mã (IntelliSense), kiểm tra lỗi cú pháp, tô màu và điều hướng mã nguồn, đồng thời hỗ trợ biên dịch và gỡ lỗi chương trình thông qua các trình biên dịch và trình gỡ lỗi bên ngoài như gcc và gdb.

    Thực hiện cài đặt theo các bước sau:

    • Khởi động Visual Studio Code.
    • Nhấn tổ hợp phím Ctrl + Shift + X để mở mục Extensions.
    • Nhập từ khóa C/C++ vào ô tìm kiếm.
    • Chọn extension C/C++ của Microsoft.
    • Nhấp Install để cài đặt.
    Microsoft Extensions for C
  6. Tạo cấu trúc dự án

    Cấu trúc dự án là cách tổ chức và sắp xếp các thư mục, tệp tin trong một dự án phần mềm theo một quy ước nhất định. Việc xây dựng cấu trúc dự án hợp lý giúp quá trình phát triển, quản lý, bảo trì và mở rộng dự án trở nên dễ dàng, nhất quán và hiệu quả hơn.

    1. Tạo thư mục gốc của dự án

      Thư mục gốc của dự án (project root directory) là thư mục cấp cao nhất của một dự án phần mềm, đây là thư mục chứa toàn bộ các tập tin và các thư mục con của dự án.

      • Khởi động Visual Studio Code.
      • Nhấn tổ hợp phím Ctrl + Shift + E để mở cửa sổ Explorer.
      • Chọn File → Open Folder.
      • Chọn New Folder để tạo thư mục mới (giả sử là D:\project\LearnC), sau đó nhấn Enter.
      • Nhấp vào thư mục vừa tạo và nhấn Select Folder để mở thư mục dự án.
    2. Tạo các thư mục con của dự án

      Bên trong thư mục LearnC, tạo lần lượt các thư mục sau:

      • .vscode: Chứa các tập tin cấu hình.
      • include: Chứa các tập tin tiêu đề (*.h).
      • source: Chứa các tập tin mã nguồn (*.c).
      • build: Chứa các tập sinh ra sau khi biên dịch.

    Hình dưới đây minh họa cấu trúc của dự án LearnC.

    Project Folder Structure
  7. Các tập tin cấu hình

    1. Tập tin c_cpp_properties.json

      Nhấp chuột phải vào thư mục .vscode, chọn New File, đặt tên cho tập tin là c_cpp_properties.json, sau đó soạn thảo nội dung tập tin như sau:

      
      	{
      		"configurations": [{
      			"name": "Win64",
      			"includePath": [
      			"${workspaceFolder}/include",
      			"C:/winlibs/mingw64/include",
      			"C:/winlibs/mingw64/lib/gcc/x86_64-w64-mingw32/14.2.0/include"
      			],
      			"defines": [],
      			"compilerPath": "C:/winlibs/mingw64/bin/gcc.exe",
      			"cStandard": "c11",
      			"intelliSenseMode": "windows-gcc-x64"
      		}],
      		"version": 4
      	}
      	
    2. Tập tin tasks.json

      Nhấp chuột phải vào thư mục .vscode, chọn New File, đặt tên cho tập tin là tasks.json, sau đó soạn thảo nội dung tập tin như sau:

      
      	{
      		"version": "2.0.0",
      		"tasks": [{
      			"label": "Build LearnC",
      			"type": "shell",
      			"command": "gcc",
      			"args": [
      				"-g",
      				"source/*.c",
      				"-Iinclude",
      				"-o",
      				"build/LearnC.exe"
      			],
      			"options": {
      				"shell": {
      					"executable": "cmd.exe",
      					"args": [
      						"/d",
      						"/c"
      					]
      				}
      			},
      			"group": {
      				"kind": "build",
      				"isDefault": true
      			},
      			"problemMatcher": [
      				"$gcc"
      			]
      		}]
      	}
      	
    3. Tập tin launch.json

      Nhấp chuột phải vào thư mục .vscode, chọn New File, đặt tên cho tập tin là launch.json, sau đó soạn thảo nội dung tập tin như sau:

      
      {
      	"version": "0.2.0",
      	"configurations": [{
      		"name": "Debug LearnC",
      		"type": "cppdbg",
      		"request": "launch",
      		"program": "${workspaceFolder}/build/LearnC.exe",
      		"args": [],
      		"stopAtEntry": false,
      		"cwd": "${workspaceFolder}",
      		"environment": [],
      		"externalConsole": true,
      		"MIMode": "gdb",
      		"miDebuggerPath": "C:/winlibs/mingw64/bin/gdb.exe",
      		"setupCommands": [
      			{
      				"description": "Enable pretty-printing for gdb",
      				"text": "-enable-pretty-printing",
      				"ignoreFailures": true
      			}
      		],
      		"preLaunchTask": "Build LearnC"
      	}]
      }
      	
    4. Tập tin settings.json

      Nhấp chuột phải vào thư mục .vscode, chọn New File, đặt tên cho tập tin là settings.json, sau đó soạn thảo nội dung tập tin như sau:

      
      	{
      		"C_Cpp.default.compilerPath": "C:/winlibs/mingw64/bin/gcc.exe",
      		"C_Cpp.debugShortcut": false,
      		"C_Cpp.autoAddFileAssociations": false
      	}