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.
- Biế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ìnhMyApp
.
- Biên dịch
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
.
- Tạo thư viện động
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.
- Liên kết AudioToolbox với
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
) choMyApp
.
- Thêm cảnh báo (
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ớiMyApp
.
- Tìm thư viện toán học (
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.
- Thêm thư mục
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/
choMyApp
.
- Thêm thư mục
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ụcsrc/
.
- Xử lý
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
.
- Đặt tên đầu ra là
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
.
- Hiển thị thông báo khi chạy
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_executable
vàset
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
?
Bình luận