Hướng dẫn Sử dụng Make và CMake để Biên dịch Mã Nguồn trên Linux

Trong môi trường Linux, bộ biên dịch tiêu chuẩn là gcc và g++, cùng với các công cụ xây dựng như make và cmake. Các thư mục liên quan đến môi trường phát triển như /usr/bin (chứa các chương trình thực thi), /usr/include (chứa mã nguồn header), và /usr/lib (chứa các thư viện đã biên dịch) có mối liên kết chặt chẽ với việc lập trình C/C++.

gcc -o my_program source1.c source2.c

Tuy nhiên, khi biên dịch các dự án lớn như mã nguồn của Git, việc phụ thuộc vào các thư viện bên ngoài (ví dụ: curl) thường gây ra lỗi vì các tệp header hoặc thư viện đó không có trong hệ thống. Việc cài đặt thủ công tất cả các phụ thuộc có thể rất phức tạp. Vì vậy, việc sử dụng các gói cài đặt nhị phân (binary packages) thường là lựa chọn thuận tiện hơn.

Để tự động hóa quá trình biên dịch, các công cụ như makecmake ra đời. make là một công cụ giúp quản lý các quy tắc biên dịch và phụ thuộc giữa các tệp tin, được định nghĩa trong một tệp có tên Makefile.

<target>: <prerequisites>
    <commands>

Cấu trúc cơ bản của một Makefile rất đơn giản. make sẽ tự động kiểm tra thời gian sửa đổi của các tệp tin và chỉ thực thi lệnh biên dịch nếu cần thiết. Lệnh make install là một mục tiêu (target) phổ biến, dùng để cài đặt các tệp tin đã biên dịch vào hệ thống. Bạn có thể chỉ định đường dẫn cài đặt bằng cách sử dụng make -D CMAKE_INSTALL_PREFIX=/your/path.

Với các dự án có quy mô lớn, việc viết và bảo trì Makefile thủ công trở nên khó khăn. cmake ra đời như một giải pháp, nó là một công cụ tạo ra Makefile từ một tệp cấu hình có tên CMakeLists.txt, dễ đọc và dễ bảo trì hơn.

# Yêu cầu phiên bản cmake tối thiểu
cmake_minimum_required(VERSION 3.10)

# Đặt tên cho dự án
project(MyProject CXX)

# Thiết lập tiêu chuẩn C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Tìm kiếm thư viện log4cpp
find_library(LOG4CPP_LIB log4cpp
    PATHS /usr/lib /usr/local/lib
)

# Tìm kiếm thư viện Boost
find_package(Boost REQUIRED COMPONENTS system thread)

# Thêm đường dẫn tìm kiếm cho các tệp header
include_directories(${Boost_INCLUDE_DIRS})

# Thêm thư mục con 'utils' vào quá trình biên dịch
add_subdirectory(utils)

# Tạo tệp thực thi chính
add_executable(my_executable main.cpp)

# Liên kết các thư viện cần thiết
target_link_libraries(my_executable
    ${LOG4CPP_LIB}
    Boost::system
    Boost::thread
    utils_library
)

Thẻ: make cmake gcc linux build-automation

Đăng vào ngày 16 tháng 05 lúc 13:19