Dưới đây là danh sách các cú pháp phổ biến trong CMakeLists.txt, kèm giải thích ngắn gọn và ví dụ minh họa. Những cú pháp này sẽ giúp bạn hiểu cách sử dụng CMake để biên dịch dự án C++ . Tôi sẽ giữ ví dụ đơn giản và thực tế.


1. cmake_minimum_required

  • Ý nghĩa: Chỉ định phiên bản CMake tối thiểu cần thiết để chạy tệp này.
  • Ví dụ:
    cmake_minimum_required(VERSION 3.20)
    
    • Yêu cầu CMake phiên bản 3.20 trở lên (hỗ trợ tốt C++23).

2. project

  • Ý nghĩa: Đặt tên dự án và chỉ định ngôn ngữ lập trình.
  • Ví dụ:
    project(MyApp LANGUAGES CXX)
    
    • Tạo dự án tên “MyApp” dùng C++.

3. set

  • Ý nghĩa: Gán giá trị cho một biến (dùng để lưu danh sách file, cờ biên dịch, v.v.).
  • Ví dụ:
    set(SOURCES main.cpp utils.cpp)
    
    • Biến SOURCES chứa danh sách file nguồn.

4. add_executable

  • Ý nghĩa: Tạo một tệp thực thi từ các file nguồn.
  • Ví dụ:
    add_executable(MyApp main.cpp)
    
    • Biên dịch main.cpp thành chương trình MyApp.

5. add_library

  • Ý nghĩa: Tạo một thư viện (static .a hoặc shared .so/.dylib) từ các file nguồn.
  • Ví dụ:
    add_library(MyLib SHARED src/lib.cpp)
    
    • Tạo thư viện động MyLib từ lib.cpp.

6. target_link_libraries

  • Ý nghĩa: Liên kết thư viện hoặc framework với target (thực thi hoặc thư viện).
  • Ví dụ:
    target_link_libraries(MyApp PRIVATE "-framework AudioToolbox")
    
    • Liên kết AudioToolbox với MyApp trên macOS.

7. if / endif

  • Ý nghĩa: Điều kiện để thực thi lệnh dựa trên biến hoặc hệ điều hành.
  • Ví dụ:
    if(APPLE)
        message("Building for macOS")
    endif()
    
    • In thông báo nếu biên dịch trên macOS.

8. set(CMAKE_CXX_STANDARD)

  • Ý nghĩa: Chỉ định chuẩn C++ (11, 17, 20, 23, v.v.).
  • Ví dụ:
    set(CMAKE_CXX_STANDARD 23)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    
    • Dùng C++23 và yêu cầu compiler hỗ trợ.

9. target_compile_options

  • Ý nghĩa: Thêm cờ biên dịch cho target cụ thể.
  • Ví dụ:
    target_compile_options(MyApp PRIVATE -Wall -g)
    
    • Thêm cảnh báo (-Wall) và debug info (-g) cho MyApp.

10. find_library

  • Ý nghĩa: Tìm thư viện hệ thống hoặc bên ngoài và lưu vào biến.
  • Ví dụ:
    find_library(MATH_LIB m)
    target_link_libraries(MyApp PRIVATE ${MATH_LIB})
    
    • Tìm thư viện toán học (libm) và liên kết với MyApp.

11. include_directories

  • Ý nghĩa: Thêm thư mục chứa file header (.h) vào đường dẫn include.
  • Ví dụ:
    include_directories(include)
    
    • Thêm thư mục include/ để tìm file header.

12. target_include_directories

  • Ý nghĩa: Thêm thư mục include chỉ cho target cụ thể (khuyến khích hơn include_directories).
  • Ví dụ:
    target_include_directories(MyApp PUBLIC include)
    
    • Thêm thư mục include/ cho MyApp.

13. add_subdirectory

  • Ý nghĩa: Thêm một thư mục con chứa CMakeLists.txt khác vào quá trình build.
  • Ví dụ:
    add_subdirectory(src)
    
    • Xử lý CMakeLists.txt trong thư mục src/.

14. set_target_properties

  • Ý nghĩa: Thiết lập thuộc tính cho target (tên đầu ra, hậu tố, v.v.).
  • Ví dụ:
    set_target_properties(MyLib PROPERTIES OUTPUT_NAME "CustomLib" SUFFIX ".dylib")
    
    • Đặt tên đầu ra là CustomLib.dylib.

15. message

  • Ý nghĩa: In thông báo trong quá trình cấu hình hoặc build.
  • Ví dụ:
    message("Configuring project for C++23")
    
    • Hiển thị thông báo khi chạy cmake.

Ví dụ đầy đủ: CMakeLists.txt cho AudioPlayer

cmake_minimum_required(VERSION 3.20)
project(AudioPlayer LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(SOURCES
    AudioPlayer.cpp
    IOSAudioBackend.cpp
    main.cpp
)

add_library(AudioPlayer SHARED ${SOURCES})

if(APPLE)
    target_link_libraries(AudioPlayer PRIVATE "-framework AudioToolbox")
    set_target_properties(AudioPlayer PROPERTIES
        OUTPUT_NAME "AudioPlayer"
        SUFFIX ".dylib"
    )
    message("Building AudioPlayer for macOS with AudioToolbox")
endif()

target_compile_options(AudioPlayer PRIVATE -Wall -g)
target_include_directories(AudioPlayer PUBLIC include)

# Giả lập tích hợp thư viện ABC/XYZ
find_library(ABC_LIB abc)
if(ABC_LIB)
    target_link_libraries(AudioPlayer PRIVATE ${ABC_LIB})
endif()

Giải thích ví dụ

  • Dùng các cú pháp phổ biến để:
    • Đặt chuẩn C++23.
    • Tạo thư viện động AudioPlayer.dylib.
    • Liên kết AudioToolbox trên macOS.
    • Thêm cờ biên dịch và thư mục include.
    • Tìm và liên kết thư viện ABC (nếu có).

Cách chạy

mkdir build
cd build
cmake ..
make

Mẹo học CMake

  • Bắt đầu đơn giản: Dùng add_executableset cho dự án nhỏ.
  • Thử nghiệm: Thêm từng lệnh như if, target_link_libraries để hiểu cách hoạt động.
  • Tài liệu: Tra cứu CMake Documentation khi cần lệnh nâng cao.

Bạn muốn tôi giải thích chi tiết hơn về cú pháp nào hoặc tạo ví dụ phức tạp hơn không? Ví dụ: Tích hợp cả Android và iOS trong cùng một CMakeLists.txt?