GIỚI THIỆU VỀ MAKE VÀ CMAKE

make là một trong những luật pháp giúp tự động hóa quy trình biên dịch mã mối cung cấp, dựa vào này mà chúng ta có thể biên dịch các project tinh vi một cách thuận lợi và mau lẹ rộng. Các thiết đặt mang lại quy trình biên dịch một project được lưu giữ vào file Maketệp tin để make hoàn toàn có thể thực hiện. Tuy nhiên, độ phức tạp của Makefile cũng tỉ lệ thuận với độ phức hợp của project, cho nên vì vậy CMake vẫn ra đời nhằm giải quyết và xử lý sự việc này.

Bạn đang xem: Cmake là gì

CMake giúp tự động hóa hình thành Maketệp tin mà lại make rất có thể áp dụng nhằm biên dịch project của chúng ta. Đối cùng với từng project, những setup mang lại CMake được giữ vào tệp tin CMakeLists.txt.

MỘT SỐ CMAKE COMMAND QUAN TRỌNG

+ cmake_minimum_required() – nguyên lý phiên bạn dạng CMake về tối tgọi yêu cầu đến project.Ví dụ: cmake_minimum_required(VERSION 2.8)

+ project() – viết tên đến project hiện tại.Ví dụ: project(Demo)

+ find_package()Ví dụ: find_package(OpenCV REQUIRED)

+ set() – sản xuất hoặc biến đổi quý giá của một vươn lên là.Ví dụ: set(INCLUDE_PATH ../library_1 ../library_2)

+ file() – chế tác một list những file vừa lòng pattern đến trước, thường xuyên được áp dụng nắm cho set() trong một vài trường đúng theo.Ví dụ: file(GLOB SOURCE “*.cpp”)

+ add_subdirectory() – thêm 1 sub-directory vào project, sub-directory này cất một file CMakeLists.txt riêng rẽ. Được dùng để làm phân tách project thành phần lớn nhỏ hơn hoặc Khi đề xuất thêm Unit Testing.

+ target_include_directories() – đã cho thấy những thư mực chứa những file header dành riêng cho một đối tượng cụ thể. Đối tượng này phải được tạo nên vày lệnh add_library() hoặc add_executable().

+ target_link_libraries() – thêm libraries vào target file.Ví dụ: target_link_libraries(targetFile lib_1 lib_2)

+ include_directories() – đã cho thấy những tlỗi mục đựng những tệp tin header.Ví dụ: include_directories(../include_1 ../include_2)

+ link_directories() – đã cho thấy những thư mục chứa static cùng shared libraries. Ví dụ: link_directories(../library_1 ../library_2)

+ add_library() – tạo nên static với shared library trường đoản cú những source files.Ví dụ: add_library(staticLib STATIC sourcefile_1 sourcefile_2)add_library(sharedLib SHARED sourcefile_1 sourcefile_2)

+ target_compile_definitions() – thêm các macro cho quy trình biên dịch, được sử dụng cho CMake >= 3.12Ví dụ: add_compile_definitions(VERSION=1.2 DEBUG)

+ target_compile_options() – thêm các options đến compiler vào quy trình biên dịch.Ví dụ: add_compile_options(-std=c99 -Os -Wall)

+ add_executable() – chế tác executable tệp tin trường đoản cú các source files.Ví dụ: add_executable(targetFile sourcefile_A sourcefile_B sourcefile_C)

+ set_target_properties() – đổi khác ở trong tính của một hoặc các target.Ví dụ: set_target_properties($TARGET PROPERTIES OUTPUT_NAME $TARGET.axf)

+ add_custom_target() –

+ add_custom_command() –

+ install() -setup file runtime/library vào directory được chỉ định Khi lệnh “make install” được triển khai.Ví dụ: install(TARGETS staticLib sharedLib DESTINATION /usr/local/lib)

MỘT SỐ CMAKE VARIABLES THƯỜNG DÙNG

+ CMAKE_BUILD_TYPE – chọn phong cách build mang đến source code, gồm: DEBUG, RELEASE, RelWithDebInfo với MinSizeRel.

+ CMAKE_INSTALL_PREFIX – lựa chọn directory nhằm install thỏng viện, executable lúc Điện thoại tư vấn lệnh “make install”;

+ CMAKE_SOURCE_DIR – directory đựng tệp tin CMakeLists.txt trước tiên được cách xử lý. Đây chính là directory nhưng bọn họ đã thực hiện cùng với lệnh cmake;

+ CMAKE_BINARY_DIR – directory của thư mục build, địa điểm nhưng mà chúng ta vẫn Điện thoại tư vấn lệnh “cmake ..”;

+ CMAKE_CURRENT_SOURCE_DIR – directory cất tệp tin CMakeLists.txt đang được xử lý;

+ CMAKE_CURRENT_BINARY_DIR – directory của folder build, khu vực mà lại file CMakeLists.txt đang rất được xử lý sẽ được thực hiện bởi vì cmake;

+ PROJECT_SOURCE_DIR – directory (full path) cất tệp tin CMakeLists.txt gồm chứa command PROJECT();

+ PROJECT_BINARY_DIR – directory (full path) của thư mục build, chỗ nhưng mà tệp tin CMakeLists.txt tất cả chứa command PROJECT() sẽ được thực hiện vì chưng cmake;

+ CMAKE__COMPILER – chọn compiler mang lại từng ngữ điệu, ví dụ: CMAKE_C_COMPILER=avr-gcc;

+ CMAKE_SYSTEM_NAME – được sử dụng để chỉ ra thương hiệu của “target system” Khi cross-compiling (Tức là hệ thống mà lại trên kia code được thực thi). Target system hoàn toàn có thể là Linux, Windows hoặc Generic (nếu như target system không có hệ quản lý điều hành, chẳng hạn như những cái vi điều khiển và tinh chỉnh 8-bit).

VÍ DỤ 1 – build source code

Biên dịch một project tất cả thực hiện tlỗi viện OpenCV cùng với CMake cùng make.

Cấu trúc project:DemoProject|—- build|—- libraries|—-|—- argparse.h|—-|—- argparse.cpp|—- displayImage.cpp|—- CMakeLists.txtTrong số đó, tlỗi mục build được dùng làm cất những build files cùng binary file.

File: CMakeLists.txt


cmake_minimum_required(VERSION 2.8)project(Demo)find_package(OpenCV REQUIRED)# Target filenameset(TARGET_FILE displayImage)# Path lớn libraries set(INCLUDE_PATH ./libraries)# Load required source files in librariesset(LIB_SOURCES $INCLUDE_PATH/argparse.cpp)# Load all source files in project folderset(SOURCES displayImage.cpp)message(STATUS "OpenCV_INCLUDE_DIRS = $OpenCV_INCLUDE_DIRS")message(STATUS "OpenCV_LIBS = $OpenCV_LIBS")include_directories($OpenCV_INCLUDE_DIRS $INCLUDE_PATH)add_compile_options(-std=c++11 -g -O3 -Wall -Werror)add_executable($TARGET_FILE $SOURCES $LIB_SOURCES)target_link_libraries($TARGET_FILE $OpenCV_LIBS)

#include "iostream"#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include "argparse.h"using namespace std;int main(int argc, char** argv)ArgumentParser ap(argc, argv);ap.add_argument("-f", "--file", "None", "Path lớn input đầu vào file");ap.parse_args(); cv::Mat image = cv::imread(ap.get("file")); cv::imshow("Image", image); cv::waitKey(0); return 0;
Tạo build files cùng với CMake:$ cd build$ cmake ..

Nếu hầu hết thứ OK, họ sẽ có được công dụng như hình 1 cùng 2:


*
Hình 1 – CMake result message
*
Hình 2 – những build files đã được tạo
*
Hình 3 – file binary displayImage đã có được build thành công
VÍ DỤ 2 – sinh sản thỏng viện tĩnh với tlỗi viện động

Cũng với project sống ví dụ 1, lần này chúng ta sẽ khởi tạo thư viện tĩnh (static library) từ bỏ các tệp tin vào thỏng mục libraries, tiếp đến sử dụng thỏng viện vừa chế tác sinh hoạt lịch trình chủ yếu.

Xem thêm: Màn Hình Amoled Là Gì ? Chất Lượng Và Cơ Chế Hoạt Động Ra Sao

Cấu trúc project:DemoProject|—- build|—- libraries|—-|—- argparse.h|—-|—- argparse.cpp|—-|—- CMakeLists.txt|—- displayImage.cpp|—- CMakeLists.txtTrong số đó, thỏng mục build được dùng để làm đựng những build files và binary file.

File: libraries/CMakeLists.txt


cmake_minimum_required(VERSION 3.4)add_compile_options(-std=c++11-Wall-Werror-O2)set(LIB_NAME argparse)add_library($LIB_NAME STATIC argparse.cpp)target_include_directories($LIB_NAME PUBLIC .)
Giải thích:Dòng 12: sản xuất thỏng viện tĩnh mang tên argparse từ bỏ tệp tin argparse.cpp; nhằm chế tác thư viện hễ, chỉ việc thế STATIC vày SHARED;– Dòng 13: đã cho thấy thỏng mục đựng những tệp tin header được dùng cho thỏng viện argparse; từ khoá PUBLIC được áp dụng để cho phép chương trình bao gồm hoàn toàn có thể kiếm tìm thấy những tệp tin header quan trọng trên thỏng mục này, ngược lại, hãy thực hiện PRIVATE.

File: CMakeLists.txt


cmake_minimum_required(VERSION 3.4)project(Demo)find_package(OpenCV REQUIRED)add_subdirectory(libraries)# Target filenameset(TARGET_FILE displayImage)# Load all source files in project folderset(SOURCES displayImage.cpp)message(STATUS "OpenCV_INCLUDE_DIRS = $OpenCV_INCLUDE_DIRS")message(STATUS "OpenCV_LIBS = $OpenCV_LIBS")include_directories($OpenCV_INCLUDE_DIRS)add_compile_options(-std=c++11-Wall-Werror-O2)add_executable($TARGET_FILE $SOURCES)target_link_libraries($TARGET_FILE $OpenCV_LIBS argparse)
Giải thích:Dòng 6: thêm thỏng mục libraries chứa thỏng viện argparse vào project; với add_subdirectory(), chúng ta cũng có thể tạo và links thư viện vào chương trình thiết yếu chưa đến 01 lần build;– Dòng 17: bởi lúc sản xuất thư viện argparse, họ đã knhị báo thư mục chứa các file header của thư viện này với keywork PUBLIC phải hiện giờ không cần phải knhì báo lại các tệp tin header này nữa. – Dòng 27: liên kết thỏng viện argparse đã làm được chế tác vào lịch trình bao gồm.

Tạo build files cùng với CMake:$ cd build$ cmake ..

Build project cùng với Make:$ make

Sau Khi build ngừng, bên trong thỏng mục build đang nhỏng sau:


*
Hình 4 – bên trong thỏng mục build tất cả cất thư mục libraries
*
Hình 5 – bên phía trong thỏng mục libraries có chứa tlỗi viện libargparse.a

Reference:<1> CMake – Công nỗ lực sinh Maketệp tin, Project file mang đến source code C/C++.<2> CMake – useful variables.<3> Debug vs Release in CMake.<4> What is the difference between include_directories and target_include_directories in CMake?<5> CMake cross-compiling.<6> CMake Directory Varialbles.

Bài viết liên quan

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *