Linux cmake command

Tìm hiểu về Lệnh cmake trong Linux: Hướng dẫn chi tiết cho người mới bắt đầu

Chào mừng bạn đến với thế giới của CMake trên Linux! Nếu bạn là một lập trình viên C++ hoặc đang làm việc với các dự án phần mềm lớn, chắc hẳn bạn đã nghe nói đến CMake. CMake là một công cụ xây dựng hệ thống (build system generator) mạnh mẽ, giúp bạn quản lý và tự động hóa quá trình biên dịch dự án của mình trên nhiều nền tảng khác nhau, bao gồm cả Linux. Bài viết này sẽ cung cấp cho bạn cái nhìn tổng quan về lệnh cmake trong Linux, từ cơ bản đến nâng cao, giúp bạn tự tin sử dụng nó trong công việc hàng ngày.

Trong bài viết này, chúng ta sẽ cùng nhau khám phá:

  • CMake là gì và tại sao nó lại quan trọng?
  • Cài đặt CMake trên Linux.
  • Cú pháp cơ bản của lệnh cmake.
  • Cách tạo một file CMakeLists.txt đơn giản.
  • Các tùy chọn thường dùng của lệnh cmake.
  • Ví dụ thực tế về cách sử dụng cmake để biên dịch một dự án C++.
  • Giải quyết các vấn đề thường gặp khi sử dụng cmake.

CMake là gì và tại sao nó lại quan trọng?

CMake không phải là một hệ thống build thực tế như Make hay Ninja. Thay vào đó, nó là một "meta-build system", tức là nó tạo ra các file build cho các hệ thống build khác. Điều này có nghĩa là bạn có thể sử dụng CMake để tạo ra file Makefile cho GNU Make, hoặc file project cho Visual Studio, hoặc file build.ninja cho Ninja. Sự linh hoạt này giúp bạn dễ dàng biên dịch dự án của mình trên nhiều nền tảng và môi trường khác nhau mà không cần phải chỉnh sửa file build thủ công cho từng hệ thống.

Sử dụng CMake mang lại nhiều lợi ích:

  • Tính di động: CMake cho phép bạn tạo các file build có thể chạy trên nhiều nền tảng khác nhau.
  • Quản lý dependencies dễ dàng: CMake cung cấp các hàm và macro để quản lý dependencies của dự án một cách hiệu quả.
  • Tính linh hoạt cao: CMake có thể được tùy chỉnh để phù hợp với nhiều loại dự án khác nhau, từ đơn giản đến phức tạp.
  • Cộng đồng hỗ trợ lớn mạnh: CMake có một cộng đồng người dùng và nhà phát triển lớn mạnh, cung cấp nhiều tài liệu, ví dụ và hỗ trợ.

Cài đặt CMake trên Linux

Việc cài đặt CMake trên Linux khá đơn giản. Bạn có thể sử dụng trình quản lý gói của hệ thống (ví dụ: apt trên Debian/Ubuntu, yum trên CentOS/RHEL, pacman trên Arch Linux) hoặc tải xuống phiên bản mới nhất từ trang web chính thức của CMake.

Ví dụ cài đặt trên Debian/Ubuntu:

sudo apt update
sudo apt install cmake

Ví dụ cài đặt trên CentOS/RHEL:

sudo yum update
sudo yum install cmake

Sau khi cài đặt, bạn có thể kiểm tra phiên bản CMake đã cài đặt bằng lệnh:

cmake --version

Cú pháp cơ bản của lệnh cmake

Lệnh cmake thường được sử dụng để cấu hình dự án dựa trên file CMakeLists.txt. Cú pháp cơ bản của lệnh như sau:

cmake [options] 
  • [options]: Các tùy chọn điều khiển quá trình cấu hình. Chúng ta sẽ tìm hiểu về một số tùy chọn quan trọng ở phần sau.
  • : Đường dẫn đến thư mục chứa file CMakeLists.txt.

Ví dụ, nếu file CMakeLists.txt nằm trong thư mục hiện tại, bạn có thể chạy lệnh:

cmake .

Lệnh này sẽ tạo ra các file build trong thư mục hiện tại. Thông thường, người ta tạo một thư mục riêng biệt để chứa các file build, ví dụ như thư mục build, để giữ cho thư mục mã nguồn sạch sẽ.

mkdir build
cd build
cmake ..

Trong ví dụ này, chúng ta tạo thư mục build, chuyển vào thư mục đó, và sau đó chạy cmake ... Dấu .. chỉ đường dẫn lên một cấp, tức là thư mục chứa file CMakeLists.txt.

Cách tạo một file CMakeLists.txt đơn giản

CMakeLists.txt là trái tim của hệ thống build CMake. Nó là một file văn bản chứa các lệnh CMake để mô tả cách xây dựng dự án của bạn. Một file CMakeLists.txt đơn giản có thể trông như sau:

cmake_minimum_required(VERSION 3.10)
project(MyProject)

add_executable(MyProject main.cpp)

Giải thích từng dòng:

  • cmake_minimum_required(VERSION 3.10): Yêu cầu phiên bản CMake tối thiểu là 3.10.
  • project(MyProject): Đặt tên cho dự án là "MyProject".
  • add_executable(MyProject main.cpp): Tạo một file thực thi có tên "MyProject" từ file mã nguồn main.cpp.

Để sử dụng file CMakeLists.txt này, bạn cần tạo một file main.cpp đơn giản, ví dụ:

#include 

int main() {
  std::cout << "Hello, CMake!" << std::endl;
  return 0;
}

Sau đó, bạn có thể chạy các lệnh sau để biên dịch dự án:

mkdir build
cd build
cmake ..
make

Lệnh make sẽ sử dụng file Makefile được tạo bởi CMake để biên dịch mã nguồn và tạo ra file thực thi "MyProject". Bạn có thể chạy file thực thi này bằng lệnh:

./MyProject

Kết quả sẽ là:

Hello, CMake!

Các tùy chọn thường dùng của lệnh cmake

Lệnh cmake cung cấp nhiều tùy chọn để điều khiển quá trình cấu hình. Dưới đây là một số tùy chọn thường dùng:

  • -G : Chỉ định trình tạo build (build system generator). Ví dụ: -G "Unix Makefiles" để tạo file Makefile cho GNU Make, -G "Ninja" để tạo file build.ninja cho Ninja, -G "Visual Studio 16 2019" để tạo file project cho Visual Studio 2019.
  • -D =: Định nghĩa một biến CMake. Ví dụ: -D CMAKE_BUILD_TYPE=Debug để build ở chế độ Debug, -D CMAKE_INSTALL_PREFIX=/usr/local để chỉ định thư mục cài đặt.
  • -Werror: Biến cảnh báo thành lỗi. Điều này giúp bạn phát hiện và sửa lỗi sớm hơn.
  • -DCMAKE_EXPORT_COMPILE_COMMANDS=YES: Tạo file compile_commands.json, hữu ích cho các công cụ phân tích mã tĩnh và IDE.

Ví dụ thực tế về cách sử dụng cmake để biên dịch một dự án C++

Giả sử bạn có một dự án C++ phức tạp hơn với nhiều file mã nguồn và thư viện phụ thuộc. Cấu trúc thư mục dự án có thể như sau:

MyProject/
├── CMakeLists.txt
├── include/
│   └── MyMath.h
└── src/
    ├── MyMath.cpp
    └── main.cpp

File MyMath.h chứa khai báo của một số hàm toán học:

#ifndef MYMATH_H
#define MYMATH_H

int add(int a, int b);
int subtract(int a, int b);

#endif

File MyMath.cpp chứa định nghĩa của các hàm toán học:

#include "MyMath.h"

int add(int a, int b) {
  return a + b;
}

int subtract(int a, int b) {
  return a - b;
}

File main.cpp sử dụng các hàm toán học:

#include 
#include "MyMath.h"

int main() {
  int x = 10;
  int y = 5;
  std::cout << "x + y = " << add(x, y) << std::endl;
  std::cout << "x - y = " << subtract(x, y) << std::endl;
  return 0;
}

File CMakeLists.txt có thể trông như sau:

cmake_minimum_required(VERSION 3.10)
project(MyProject)

# Thêm thư mục include
include_directories(include)

# Tạo thư viện MyMath
add_library(MyMath src/MyMath.cpp)

# Tạo file thực thi MyProject
add_executable(MyProject src/main.cpp)

# Liên kết file thực thi với thư viện MyMath
target_link_libraries(MyProject MyMath)

Giải thích:

  • include_directories(include): Thêm thư mục include vào đường dẫn tìm kiếm của trình biên dịch.
  • add_library(MyMath src/MyMath.cpp): Tạo một thư viện có tên "MyMath" từ file mã nguồn src/MyMath.cpp.
  • add_executable(MyProject src/main.cpp): Tạo một file thực thi có tên "MyProject" từ file mã nguồn src/main.cpp.
  • target_link_libraries(MyProject MyMath): Liên kết file thực thi "MyProject" với thư viện "MyMath".

Bạn có thể biên dịch dự án bằng các lệnh sau:

mkdir build
cd build
cmake ..
make

Chạy file thực thi MyProject sẽ cho kết quả:

x + y = 15
x - y = 5

Giải quyết các vấn đề thường gặp khi sử dụng cmake

Mặc dù CMake là một công cụ mạnh mẽ, nhưng bạn có thể gặp một số vấn đề khi sử dụng nó. Dưới đây là một số vấn đề thường gặp và cách giải quyết:

  • Lỗi "CMake Error: CMake was unable to find a build program corresponding to "Unix Makefiles".": Điều này có nghĩa là bạn chưa cài đặt GNU Make. Hãy cài đặt nó bằng trình quản lý gói của hệ thống.
  • Lỗi "Could NOT find Boost": Điều này có nghĩa là CMake không thể tìm thấy thư viện Boost. Hãy đảm bảo rằng Boost đã được cài đặt và đường dẫn đến Boost được chỉ định đúng trong CMakeLists.txt bằng cách sử dụng find_package(Boost REQUIRED COMPONENTS ...)
  • Lỗi liên kết: Điều này có thể xảy ra nếu bạn quên liên kết file thực thi với thư viện cần thiết. Hãy kiểm tra lại lệnh target_link_libraries trong CMakeLists.txt.

So sánh CMake với các hệ thống build khác

Tính năng CMake Make Autotools
Tính di động Cao Thấp (phụ thuộc vào Makefile) Trung bình
Độ phức tạp Trung bình Cao (cho dự án lớn) Cao
Khả năng mở rộng Cao Trung bình Cao
Quản lý dependencies Tốt Yếu Trung bình
Hỗ trợ IDE Tốt Hạn chế Hạn chế

FAQ về Lệnh cmake trong Linux

CMake có miễn phí không?
Có, CMake là một phần mềm mã nguồn mở miễn phí.
Tôi có cần biết C++ để sử dụng CMake không?
Không nhất thiết. Bạn cần hiểu cú pháp của CMake và cách nó hoạt động để quản lý quá trình build, nhưng bạn không cần phải là chuyên gia C++.
Làm thế nào để debug các file CMakeLists.txt?
Bạn có thể sử dụng lệnh message(STATUS "...") để in thông tin ra màn hình trong quá trình cấu hình. Ngoài ra, một số IDE như Visual Studio Code có các extension hỗ trợ debug CMakeLists.txt.
CMake có thể được sử dụng cho các ngôn ngữ khác ngoài C++ không?
Có, CMake có thể được sử dụng cho nhiều ngôn ngữ khác như C, Fortran, và Java.

Kết luận

CMake là một công cụ không thể thiếu cho bất kỳ lập trình viên C++ nào làm việc trên Linux. Với khả năng tạo build system trên nhiều nền tảng, quản lý dependencies hiệu quả, và tính linh hoạt cao, CMake giúp bạn đơn giản hóa quá trình phát triển phần mềm và tập trung vào việc viết mã. Hy vọng bài viết này đã cung cấp cho bạn một cái nhìn tổng quan về lệnh cmake và giúp bạn tự tin hơn khi sử dụng nó trong các dự án của mình. Hãy bắt đầu khám phá CMake ngay hôm nay và trải nghiệm những lợi ích mà nó mang lại!

Last Updated : 22/08/2025