Giới thiệu
Trong lab này, chúng ta sẽ khám phá lệnh cmake
của Linux và các ứng dụng thực tế của nó. Chúng ta sẽ bắt đầu bằng cách cài đặt CMake, một công cụ tự động hóa build phổ biến, trên môi trường Ubuntu 22.04 của chúng ta. Sau đó, chúng ta sẽ tạo một dự án C++ đơn giản và học cách sử dụng CMake để quản lý quy trình build. Cuối cùng, chúng ta sẽ hiểu các cấu hình build khác nhau có sẵn trong CMake.
Các bước được đề cập trong lab này rất cần thiết cho các nhà phát triển làm việc với các dự án C/C++ và cần quản lý các quy trình build phức tạp một cách hiệu quả. Đến cuối lab này, bạn sẽ có một sự hiểu biết vững chắc về cách sử dụng CMake để hợp lý hóa quy trình phát triển của bạn.
Cài đặt CMake trên Ubuntu 22.04
Trong bước này, chúng ta sẽ cài đặt CMake, một công cụ tự động hóa build phổ biến, trên môi trường Ubuntu 22.04 của chúng ta.
Đầu tiên, hãy cập nhật chỉ mục gói:
sudo apt-get update
Ví dụ đầu ra:
Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Get:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [114 kB]
Get:4 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [99.8 kB]
Fetched 324 kB in 1s (324 kB/s)
Reading package lists... Done
Tiếp theo, cài đặt các gói cần thiết cho CMake:
sudo apt update
sudo apt-get install -y cmake
Ví dụ đầu ra:
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
cmake-data libarchive13 libjsoncpp24 librhash0 libssl-dev libssl1.1
Suggested packages:
cmake-doc
The following NEW packages will be installed:
cmake cmake-data libarchive13 libjsoncpp24 librhash0 libssl-dev libssl1.1
0 upgraded, 7 newly installed, 0 to remove and 0 not upgraded.
Need to get 15.6 MB of archives.
After this operation, 67.6 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://archive.ubuntu.com/ubuntu jammy/main amd64 libssl1.1 amd64 1.1.1m-3ubuntu1 [1,296 kB]
Get:2 http://archive.ubuntu.com/ubuntu jammy/main amd64 libssl-dev amd64 1.1.1m-3ubuntu1 [1,547 kB]
Get:3 http://archive.ubuntu.com/ubuntu jammy/main amd64 libarchive13 amd64 3.5.2-2 [262 kB]
Get:4 http://archive.ubuntu.com/ubuntu jammy/main amd64 libjsoncpp24 amd64 1.9.5-2 [104 kB]
Get:5 http://archive.ubuntu.com/ubuntu jammy/main amd64 librhash0 amd64 1.4.2-1 [106 kB]
Get:6 http://archive.ubuntu.com/ubuntu jammy/universe amd64 cmake-data all 3.22.1-1ubuntu1 [1,605 kB]
Get:7 http://archive.ubuntu.com/ubuntu jammy/universe amd64 cmake amd64 3.22.1-1ubuntu1 [10.7 MB]
Fetched 15.6 MB in 3s (5,204 kB/s)
Selecting previously unselected package libssl1.1:amd64.
(Reading database ... 78852 files and directories currently installed.)
Preparing to unpack .../libssl1.1_1.1.1m-3ubuntu1_amd64.deb ...
Unpacking libssl1.1:amd64 (1.1.1m-3ubuntu1) ...
Selecting previously unselected package libssl-dev:amd64.
Preparing to unpack .../libssl-dev_1.1.1m-3ubuntu1_amd64.deb ...
Unpacking libssl-dev:amd64 (1.1.1m-3ubuntu1) ...
Selecting previously unselected package libarchive13:amd64.
Preparing to unpack .../libarchive13_3.5.2-2_amd64.deb ...
Unpacking libarchive13:amd64 (3.5.2-2) ...
Selecting previously unselected package libjsoncpp24:amd64.
Preparing to unpack .../libjsoncpp24_1.9.5-2_amd64.deb ...
Unpacking libjsoncpp24:amd64 (1.9.5-2) ...
Selecting previously unselected package librhash0:amd64.
Preparing to unpack .../librhash0_1.4.2-1_amd64.deb ...
Unpacking librhash0:amd64 (1.4.2-1) ...
Selecting previously unselected package cmake-data.
Preparing to unpack .../cmake-data_3.22.1-1ubuntu1_all.deb ...
Unpacking cmake-data (3.22.1-1ubuntu1) ...
Selecting previously unselected package cmake.
Preparing to unpack .../cmake_3.22.1-1ubuntu1_amd64.deb ...
Unpacking cmake (3.22.1-1ubuntu1) ...
Setting up libssl1.1:amd64 (1.1.1m-3ubuntu1) ...
Setting up libssl-dev:amd64 (1.1.1m-3ubuntu1) ...
Setting up libarchive13:amd64 (3.5.2-2) ...
Setting up libjsoncpp24:amd64 (1.9.5-2) ...
Setting up librhash0:amd64 (1.4.2-1) ...
Setting up cmake-data (3.22.1-1ubuntu1) ...
Setting up cmake (3.22.1-1ubuntu1) ...
Processing triggers for man-db (2.10.2-1) ...
Processing triggers for libc-bin (2.35-0ubuntu3) ...
Quá trình cài đặt hiện đã hoàn tất. Bạn có thể xác minh phiên bản CMake bằng cách chạy:
cmake --version
Ví dụ đầu ra:
cmake version 3.22.1
CMake suite maintained and supported by Kitware (kitware.com/cmake).
Tuyệt vời! Chúng ta đã cài đặt thành công CMake trên môi trường Ubuntu 22.04 của chúng ta.
Tạo một Dự án C++ Đơn giản với CMake
Trong bước này, chúng ta sẽ tạo một dự án C++ đơn giản và sử dụng CMake để build nó.
Đầu tiên, hãy tạo một thư mục mới cho dự án của chúng ta:
cd ~/project
mkdir cpp-project && cd cpp-project
Tiếp theo, tạo một tệp C++ mới có tên main.cpp
với nội dung sau:
#include <iostream>
int main() {
std::cout << "Hello, CMake!" << std::endl;
return 0;
}
Bây giờ, chúng ta cần tạo một tệp CMakeLists.txt
trong cùng thư mục để xác định quy trình build của dự án. Thêm nội dung sau vào tệp:
cmake_minimum_required(VERSION 3.22)
project(cpp-project)
add_executable(cpp-project main.cpp)
Tệp CMake này đặt phiên bản CMake tối thiểu cần thiết, xác định tên dự án và thêm một target thực thi có tên cpp-project
sẽ được build từ tệp main.cpp
.
Để build dự án, hãy chạy các lệnh sau:
cmake -S . -B build
cmake --build build
Lệnh đầu tiên tạo các tệp build trong thư mục build
và lệnh thứ hai thực sự build dự án.
Ví dụ đầu ra:
-- The C compiler identification is GNU 11.2.0
-- The CXX compiler identification is GNU 11.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/labex/project/cpp-project/build
Scanning dependencies of target cpp-project
[ 50%] Building CXX object CMakeFiles/cpp-project.dir/main.cpp.o
[100%] Linking CXX executable cpp-project
[100%] Built target cpp-project
Cuối cùng, chạy tệp thực thi đã build:
./build/cpp-project
Ví dụ đầu ra:
Hello, CMake!
Chúc mừng! Bạn đã tạo thành công một dự án C++ đơn giản và build nó bằng CMake.
Tìm hiểu về Cấu hình Build CMake
Trong bước này, chúng ta sẽ khám phá các cấu hình build khác nhau có sẵn trong CMake và cách sử dụng chúng.
CMake hỗ trợ một số cấu hình build, chẳng hạn như Debug
, Release
, RelWithDebInfo
và MinSizeRel
. Các cấu hình này xác định các cài đặt tối ưu hóa và gỡ lỗi được sử dụng trong quá trình build.
Hãy bắt đầu bằng cách tạo một dự án C++ mới:
cd ~/project
mkdir cmake-configurations && cd cmake-configurations
Bây giờ, tạo một tệp main.cpp
với nội dung sau:
#include <iostream>
int main() {
std::cout << "Build Configuration: " << CMAKE_BUILD_TYPE << std::endl;
return 0;
}
Tiếp theo, tạo một tệp CMakeLists.txt
với nội dung sau:
cmake_minimum_required(VERSION 3.22)
project(cmake-configurations)
add_executable(cmake-configurations main.cpp)
Để build dự án với cấu hình Debug
mặc định, hãy chạy các lệnh sau:
cmake -S . -B build
cmake --build build
Ví dụ đầu ra:
-- The C compiler identification is GNU 11.2.0
-- The CXX compiler identification is GNU 11.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/labex/project/cmake-configurations/build
Scanning dependencies of target cmake-configurations
[ 50%] Building CXX object CMakeFiles/cmake-configurations.dir/main.cpp.o
[100%] Linking CXX executable cmake-configurations
[100%] Built target cmake-configurations
Chạy tệp thực thi đã build:
./build/cmake-configurations
Ví dụ đầu ra:
Build Configuration: Debug
Bây giờ, hãy build dự án với cấu hình Release
:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
Ví dụ đầu ra:
-- The C compiler identification is GNU 11.2.0
-- The CXX compiler identification is GNU 11.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/labex/project/cmake-configurations/build
Scanning dependencies of target cmake-configurations
[ 50%] Building CXX object CMakeFiles/cmake-configurations.dir/main.cpp.o
[100%] Linking CXX executable cmake-configurations
[100%] Built target cmake-configurations
Chạy tệp thực thi đã build:
./build/cmake-configurations
Ví dụ đầu ra:
Build Configuration: Release
Như bạn có thể thấy, cấu hình build được phản ánh trong đầu ra của tệp thực thi. Cấu hình Debug
được sử dụng theo mặc định, nhưng bạn có thể chỉ định một cấu hình khác bằng cách sử dụng tùy chọn -DCMAKE_BUILD_TYPE
khi chạy cmake
.
Tóm tắt
Trong lab này, trước tiên chúng ta đã cài đặt CMake, một công cụ tự động hóa build phổ biến, trên môi trường Ubuntu 22.04 của chúng ta. Chúng ta đã cập nhật chỉ mục gói và sau đó cài đặt các gói cần thiết cho CMake. Tiếp theo, chúng ta đã tạo một dự án C++ đơn giản và học cách sử dụng CMake để build và quản lý dự án. Chúng ta cũng đã khám phá các cấu hình build CMake khác nhau, cho phép chúng ta tùy chỉnh quy trình build cho các môi trường hoặc mục đích khác nhau.