CMAKE LÀ GÌ

     

Gần phía trên tôi có dịp chạm vào CMake, nên có tìm hiểu một chút về nó. Hy vọng bổ ích cho anh em.

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

Nó cung cấp tính năng ra đời Makefile một cách hiệu quả. Tốt nhất là so với các dự án công trình phức tạp. Nó cũng hỗ trợ thêm những bộ sinh khác nhằm sinh cấu trúc làm chủ source cho các IDE khác biệt như Project cho Visual Studio, etc.Trong giới hạn, tôi sẽ nói tới việc thực hiện CMake nhằm build một simple project bên trên Linux.

Ta vẫn chuyển phiên quanh ví dụ kinh khủng là sản xuất chương trình Hello World, tuy thế yêu cầu hiển thị câu đó trên ít nhất 3 ngôn ngữ. Ja,en,vi. Lịch trình sẽ viết bằng ngữ điệu C.

(Link tham khảo)

Ví dụ được tiến hành trong thư mục /home/oedev/Code/CMake

Nội dung chủ yếu gồm các phần sau,

Chương trình Hello World đến En.Thêm ngữ điệu Ja, Vi vào công tác trên.Thêm ngữ điệu Spain(Es) trong một tình huống khác.

============================================================

1.Chương trình Hello World mang đến En

Ta sẽ sở hữu file source như sau:mainapp.c

#include//// Greeting message in En//void greeting_en()printf("Hello world n");//// Main functions//int main(int argc, char* argv<>)greeting_en();return 0;File sử dụng cho CMake là 1 trong file CMakeLists.txt.Nó sẽ sở hữu được nội dung như sau:

## Điều kiện về version buổi tối thiểu để đọc được file CMakeList.txt này.#cmake_minimum_required(VERSION 2.8.12)## thương hiệu project thường xuyên sẽ là tên file chạy#project (helloworld)## Định nghĩa mối liên quan giữa tệp tin chạy cùng file nguồn#add_executable(hellworld mainapp.c)Đặt cả 2 file bên trên vào thuộc 1 thư mục:Nội dung được kiểm tra bằng lệnh tree như sau

CMake├── CMakeLists.txt└── mainapp.cFile CMakeList.txt đó là file có mang source sử dụng ngữ điệu mà CMake phát âm được.Đến đây, ta thực hiện quá trình chính của CMake. Đó là ra đời Makefiles đến project đơn giản này. Ta nên chuyển vào phía bên trong thư mục CMake trước lúc chạy lệnh dưới đây:

$ cmake .Dấu . phía sau khôn xiết quan trọng. Đó là mặt đường dân đến thư mục không file CMakeList.txt hay hoàn toàn có thể thay nó bằng $(PWD) trong trường hòa hợp này.Nội dung chạy xong nên như thế này:

oedev
OECrossDev:~/Code/CMake$ cmake .-- The C compiler identification is GNU 4.8.2-- The CXX compiler identification is GNU 4.8.2-- check for working C compiler: /usr/bin/cc-- kiểm tra for working C compiler: /usr/bin/cc -- works-- Detecting C compiler ABI info-- Detecting C compiler ABI info - done-- kiểm tra for working CXX compiler: /usr/bin/c++-- check for working CXX compiler: /usr/bin/c++ -- works-- Detecting CXX compiler ABI info-- Detecting CXX compiler ABI info - done-- Configuring done-- Generating done-- Build files have been written to: /home/oedev/Code/CMakeNội dung thư mục sau khoản thời gian chạy lệnh trên:

oedev
OECrossDev:~/Code/CMake$ tree -L 2.├── CMakeCache.txt├── CMakeFiles│ ├── 2.8.12.2│ ├── cmake.check_cache│ ├── CMakeDirectoryInformation.cmake│ ├── CMakeOutput.log│ ├── CMakeTmp│ ├── hellworld.dir│ ├── Makefile2│ ├── Makefile.cmake│ ├── progress.marks│ └── TargetDirectories.txt├── cmake_install.cmake├── CMakeLists.txt├── mainapp.c└── MakefileNhư ta thấy, có khá nhiều file và thư mục được tạo ra khi ta chạy CMake. Cơ mà trong giới hạn bài này ta chỉ suy xét Makefile thôi.Ta cũng thấy rằng chương trình không được build, hay nói theo cách khác CMake chỉ làm trách nhiệm của nó mang lại đây thôi. Tức là sinh ra Makefile , rồi nghỉ.

Giờ hy vọng build project ta vừa tạo ban sơ (chỉ có một file .c), ta đã chạy Makefiles thôi.

oedev
OECrossDev:~/Code/CMake$ makeScanning dependencies of target hellworld<100%> Building C object CMakeFiles/hellworld.dir/mainapp.c.oLinking C executable hellworld<100%> Built target hellworldKết quả thu được như sau

oedev
OECrossDev:~/Code/CMake$ lsCMakeCache.txt CMakeFiles cmake_install.cmake CMakeLists.txt hellworld mainapp.c MakefileTa sẽ thây tệp tin helloword được sinh ra, đây đó là file chạy:

oedev
OECrossDev:~/Code/CMake$ ./hellworldHello worldGiờ ta vẫn thêm lời kính chào bằng ngôn ngữ Ja, Vi vào công tác trên.

2.Thêm ngữ điệu Ja, Vi vào công tác trên.

Ta sẽ tổ chức lại source như sau:

oedev
OECrossDev:~/Code/CMake$ tree.├── CMakeLists.txt├── include│ ├── greetings_en.h│ ├── greetings_ja.h│ └── greetings_vi.h└── src ├── greetings_en.c ├── greetings_ja.c ├── greetings_vi.c └── mainapp.cDo kết cấu thư mục đã chũm đổi, vị trí các file mối cung cấp cũng thế.Ta cần thay đổi file CMakeList.txt để phù hợp với chuyển đổi này.Nội dung tệp tin này vẫn thành như sau:

*CMakeList.txt*## Điều kiện về version#cmake_minimum_required(VERSION 2.8.12)## tên project#project (helloworld)## Khai bảo thư mục cất file header (.h)#include_directories(include)## Thêm từ tệp tin nguồn bởi lệnh *set*#set(SOURCES src/mainapp.c src/greetings_en.c src/greetings_ja.c src/greetings_vi.c)## thêm 1 tập những file bởi một cỗ lọc trong thư mục không source# Đây là giải pháp nhanh và thông dụng hơn.##file(GLOB SOURCES "src/*.c")## Định nghĩa sự tương quan giữa file chạy và các file nguồn.#add_executable(hellworld $SOURCES)Ta đang chạy cmake nhằm sinh Makefiles với build công tác với Makefiles xem kết quả thế nào:Với những sử dụng hàm set:Chạy cmake

oedev
OECrossDev:~/Code/CMake$ cmake .-- The C compiler identification is GNU 4.8.2-- The CXX compiler identification is GNU 4.8.2-- check for working C compiler: /usr/bin/cc-- check for working C compiler: /usr/bin/cc -- works-- Detecting C compiler ABI info-- Detecting C compiler ABI info - done-- check for working CXX compiler: /usr/bin/c++-- check for working CXX compiler: /usr/bin/c++ -- works-- Detecting CXX compiler ABI info-- Detecting CXX compiler ABI info - done-- Configuring done-- Generating done-- Build files have been written to: /home/oedev/Code/CMakeChạy Make

oedev
OECrossDev:~/Code/CMake$ makeScanning dependencies of target hellworld< 25%> Building C object CMakeFiles/hellworld.dir/src/mainapp.c.o< 50%> Building C object CMakeFiles/hellworld.dir/src/greetings_en.c.o< 75%> Building C object CMakeFiles/hellworld.dir/src/greetings_ja.c.o<100%> Building C object CMakeFiles/hellworld.dir/src/greetings_vi.c.oLinking C executable hellworld<100%> Built target hellworldKiểm tra thư mục

oedev
OECrossDev:~/Code/CMake$ tree -L 2.├── CMakeCache.txt├── CMakeFiles│ ├── 2.8.12.2│ ├── cmake.check_cache│ ├── CMakeDirectoryInformation.cmake│ ├── CMakeOutput.log│ ├── CMakeTmp│ ├── hellworld.dir│ ├── Makefile2│ ├── Makefile.cmake│ ├── progress.marks│ └── TargetDirectories.txt├── cmake_install.cmake├── CMakeLists.txt├── hellworld├── include│ ├── greetings_en.h│ ├── greetings_ja.h│ └── greetings_vi.h├── Makefile└── src ├── greetings_en.c ├── greetings_ja.c ├── greetings_vi.c └── mainapp.cKết trái chạy chương trình

oedev
OECrossDev:~/Code/CMake$ ./hellworldHello worldKonichiwa!!!Xin chao !!!!Khi cố gắng set command bởi command tệp tin (GLOB) thì cho hiệu quả gần như giống hệt nhau.

2.1 sản xuất thư mục để build riêng

À, bao gồm một điểm cần nói làm việc đây, vừa ta có thấy không ít file (ngoài Makefile) được có mặt trong quá trình cmake chạy.Nếu để những file đó bình thường với thư mục những file source, header ta vừa chế tác sẽ tạo ra rắc rối, khó quản lý. Ta sẽ tống các file đó vào 1 thư mục, gọi là folder build.Cấu trúc folder sẽ đổi khác như sau:

oedev
OECrossDev:~/Code/CMake$ tree.├── build├── CMakeLists.txt├── include│ ├── greetings_en.h│ ├── greetings_ja.h│ └── greetings_vi.h└── src ├── greetings_en.c ├── greetings_ja.c ├── greetings_vi.c └── mainapp.cGiờ ta đã thực hiện toàn bộ quá trình cmake cùng make bên phía trong thư mục build

oedev
OECrossDev:~/Code/CMake/build$ cmake ..-- The C compiler identification is GNU 4.8.2-- The CXX compiler identification is GNU 4.8.2-- kiểm tra for working C compiler: /usr/bin/cc-- kiểm tra for working C compiler: /usr/bin/cc -- works-- Detecting C compiler ABI info-- Detecting C compiler ABI info - done-- kiểm tra for working CXX compiler: /usr/bin/c++-- check for working CXX compiler: /usr/bin/c++ -- works-- Detecting CXX compiler ABI info-- Detecting CXX compiler ABI info - done-- Configuring done-- Generating done-- Build files have been written to: /home/oedev/Code/CMake/buildTa thực hiện .. thay do .

Xem thêm: Bán Nhà Sổ Riêng 700 Triệu Biên Hòa, Đồng Nai, Giá 500, Bán Nhà Riêng Đồng Nai Giá 500 Triệu

như ở các câu lệnh trước, vì chưng ta đã gửi vào folder ./build đề xuất file CMakeList.txt sống thư mục phụ vương của folder này. Ta nên nói cho cmake biết điều đó.Tiếp tục chạy lệnh make, ta sẽ sở hữu được nội dung thư mục CMake đã như sau:

oedev
OECrossDev:~/Code/CMake$ tree -L 3.├── build│ ├── CMakeCache.txt│ ├── CMakeFiles│ │ ├── 2.8.12.2│ │ ├── cmake.check_cache│ │ ├── CMakeDirectoryInformation.cmake│ │ ├── CMakeOutput.log│ │ ├── CMakeTmp│ │ ├── hellworld.dir│ │ ├── Makefile2│ │ ├── Makefile.cmake│ │ ├── progress.marks│ │ └── TargetDirectories.txt│ ├── cmake_install.cmake│ ├── hellworld│ └── Makefile├── CMakeLists.txt├── include│ ├── greetings_en.h│ ├── greetings_ja.h│ └── greetings_vi.h└── src ├── greetings_en.c ├── greetings_ja.c ├── greetings_vi.c └── mainapp.cNhư ta thấy, cục bộ nội dung của quá trình chạy cmake với make được giữ trong folder ./build, phần đinh nghĩa source code phía bên ngoài không bị ảnh hưởng gì hết.Để chạy chương trình, ta bắt buộc vào thư mục ./buildKết quả vẫn là :

oedev
OECrossDev:~/Code/CMake/build$ ./hellworld Hello worldKonichiwa!!!Xin chao !!!!3. Thêm ngôn từ Spain(es) trong một tình huống khácTình huống khác ở đây là gì? Tôi muốn nói đến tình huống như sau:Giả sử ta bao gồm một thư viện chứa lời kính chào cho 3 ngôn ngữ En, Ja, Vi.Ta phải thêm ngôn ngữ Es để sở hữu một lịch trình với loài xin chào của 4 ngôn từ En, Ja, Vi, Es.

Trước hết, ta yêu cầu hiểu thư viện như thế nào? vào C/C++ để thực hiện lại được mã mối cung cấp hoặc để đảm bảo an toàn mã nguồn. Tín đồ ta thường build đầy đủ mã nguồn mong sử dụng lại hoặc đưa cho người khác thành các thư viện. Về mặt file ta thấy được, thư viện sẽ có 2 loại: thư viện tĩnh(.a) và thư viện động(.so).Các hàm ta sẽ viết trong tệp tin .c đang nằm trong những file thư viện này.

Nếu tủ sách chỉ gồm thế thôi thì chưa đủ, ta cần phải biết thư viện đó cung cấp gì cho phía bên ngoài có thể thực hiện được. Hoàn toàn có thể là biến hóa toàn cục, có thể là hàm.

Các hàm và biến chuyển này phải đặt đâu đó trong các file header . Rồi lúc build cùng với source cơ mà ta viết, trình biên dịch sẽ biết phương pháp compile hoặc links cho say mê hợp.File header thường xuyên được hỗ trợ kèm theo những file .a(.so). Nếu không có, thì phải tài năng liệu tế bào tả.Có cả tài liệu với file header là điều lý tưởng nhất.

Giả định rằng, ta tất cả thư viện chưa giải pháp xử lý hiển thị 3 loài kính chào En, Ja, Vi. Nhưng mà ta chỉ có file header biểu lộ prototype của các hàm mà lại không phiêu lưu source của nó.

3.1 Build thư viện tĩnh

Kết trái của đoạn này vẫn là tệp tin thư viện greetings_en_ja_vi.a và 3 file header đi kèm.Sau kia ta rất có thể xóa 3 file source(.c) đi được.Về cấu trúc file, bởi thư viện không cất hàm main() được, ta nên bỏ tệp tin mainapp.c đi.Nhớ nhé, tủ sách thì chỉ việc file header thôi là dùng được rồi.Thư viện chủng loại mực sẽ không cần mang đến xem code, ta chỉ cần xem biểu hiện API hoặc file header là có thể dùng được rồi.Cấu trúc file bắt đầu sẽ như vậy này:

oedev
OECrossDev:~/Code/CMake$ tree -L 2.├── CMakeLists.txt├── include│ ├── greetings_en.h│ ├── greetings_ja.h│ └── greetings_vi.h└── src ├── greetings_en.c ├── greetings_ja.c └── greetings_vi.cGiờ, ta đề nghị sửa lại file CMakeList.txt, nó đã thành như sau:CMakeList.txt

## Điều khiếu nại phiên phiên bản nhỏ nhất của CMake#cmake_minimum_required(VERSION 2.8.12)## tên project#project (multilang_greetings)## Thêm thư mục chứa những file header (.h)#include_directories(include)## thêm một tập các file source#file(GLOB SOURCES "src/*.c")## Thư viện bao hàm những source nào.# các loại thư viện là STATIC (tĩnh)# thương hiệu thư viện rất có thể khác thương hiệu *project*#add_library(greetings_enjavi STATIC $SOURCES)Chạy tiếp cmake với make trong folder build:Ta đang được hiệu quả như sau:Chạy Cmake, hiệu quả gần như không biến đổi so với trước:

oedev
OECrossDev:~/Code/CMake/build$ cmake ..-- The C compiler identification is GNU 4.8.2-- The CXX compiler identification is GNU 4.8.2-- kiểm tra for working C compiler: /usr/bin/cc-- check for working C compiler: /usr/bin/cc -- works-- Detecting C compiler ABI info-- Detecting C compiler ABI info - done-- check for working CXX compiler: /usr/bin/c++-- check for working CXX compiler: /usr/bin/c++ -- works-- Detecting CXX compiler ABI info-- Detecting CXX compiler ABI info - done-- Configuring done-- Generating done-- Build files have been written to: /home/oedev/Code/CMake/builChạy make:

oedev
OECrossDev:~/Code/CMake/build$ makeScanning dependencies of target greetings_enjavi< 33%> Building C object CMakeFiles/greetings_enjavi.dir/src/greetings_vi.c.o< 66%> Building C object CMakeFiles/greetings_enjavi.dir/src/greetings_ja.c.o<100%> Building C object CMakeFiles/greetings_enjavi.dir/src/greetings_en.c.oLinking C static library libgreetings_enjavi.a<100%> Built target greetings_enjaviTa thấy rằng tên thư viện ra đời là libgreetings_enjavi.a, vì thế tiền tố lib được thêm vào tên thư viện ta vẫn khai báo cùng với add_library trong file CMakeList.txt.Ta rất có thể kiểm tra xem tủ sách này chứa dòng gì, bởi câu lệnh ar

oedev
OECrossDev:~/Code/CMake/build$ ar -t libgreetings_enjavi.agreetings_vi.c.ogreetings_ja.c.ogreetings_en.c.oTa vẫn thấy không tồn tại file chạy làm sao được hiện ra trong thư mục build. Đúng như mong muốn muốn, ta phải build thư viện.Ta cũng kiểm tra size file này:

oedev
OECrossDev:~/Code/CMake/build$ ls -lh libgreetings_enjavi.a -rw-rw-r-- 1 oedev oedev *4.9K* 8月 17 23:13 libgreetings_enjavi.aĐó là 4.9K (dung lượng NET), bám dính trên đĩa chắc đề nghị hơn.

3.2 Build thư viện động

Ta đã build thư viện tĩnh, được tệp tin .a (một file nén không 3 file .o). Kích thước 4.9K(NET)Giờ ra build thư viện động.Vậy rượu cồn với tĩnh không giống nhau ở vị trí nào, tại sao phải build cả động có tác dụng gì.Chuyện hơi dài, tôi sẽ trình diễn ngắn gọn. Thư viện tĩnh, có nghĩa là tất cả cách xử trí của hầu như hàm đều bên trong thư viện kia rồi. Ví dụ, nó hotline hàm printf trong source .c, thì khi tạo thành thư viện tĩnh, nó ôm cục bộ xử lý của printf vào trong tệp tin .a nhưng mà ta vừa tạo.Còn tủ sách động, thì không làm thế, nó giữ lại thông tin báo là, nơi này điện thoại tư vấn hàm printf với các tham số x,y,z gì đó. Lúc nào chạy thì hỏi tiếp xem hàm kia ở đâu, xử trí thế nào rồi bắt đầu truyền những tham số nhằm xử lý.

Cấu trúc các file source, header không chuyển đổi gì so với khi build tủ sách tĩnh.Ta cần đổi khác file CMakeList.txt một chút:Nó sẽ sở hữu được nội dung như thế này:

## Điều khiếu nại phiên bản nhỏ duy nhất của CMake#cmake_minimum_required(VERSION 2.8.12)## thương hiệu project#project (multilang_greetings)## Thêm folder chứa các file header (.h)#include_directories(include)## thêm một tập những file source#file(GLOB SOURCES "src/*.c")## Thư viện bao hàm những source nào.# loại thư viện là SHARED(động, thực tế không liền kề nghĩa mang lại lắm)# thương hiệu thư viện có thể khác thương hiệu *project*#add_library(greetings_enjavi SHARED $SOURCES)Kết trái của khi chạy CMake là không biến đổi gì, còn lúc chạy make, nó sẽ như thế này:

oedev
OECrossDev:~/Code/CMake/build$ makeScanning dependencies of target greetings_enjavi< 33%> Building C object CMakeFiles/greetings_enjavi.dir/src/greetings_vi.c.o< 66%> Building C object CMakeFiles/greetings_enjavi.dir/src/greetings_ja.c.o<100%> Building C object CMakeFiles/greetings_enjavi.dir/src/greetings_en.c.oLinking C shared library libgreetings_enjavi.so<100%> Built target greetings_enjaviThư viện được hình thành là libgreetings_enjavi.so, cũng bước đầu với chi phí tố lib, nhưng mà phần không ngừng mở rộng là .so.Với tủ sách động, ta sẽ chất vấn nội dung như sau:

oedev
OECrossDev:~/Code/CMake/build$ ldd libgreetings_enjavi.so linux-vdso.so.1 => (0x00007fff3e7fc000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6cf04e7000) /lib64/ld-linux-x86-64.so.2 (0x00007f6cf0acd000)Thực ra bản thân cũng thiếu hiểu biết kĩ mấy chiếc này, tốt nhất có thể không giải thích gì. ;))

3.3 Thêm ngữ điệu Es

Giờ ta đã bao gồm trong tay cực kỳ thư viện cùng với 2 phiên bản, tĩnh và động.Ta sẽ viết code thực hiện chúng, đồng thời thêm tác dụng lời chào bằng tiếng Spain nữa.

Với thư viện tĩnhGần như siêu giống tủ sách động, chỉ không giống tên tệp tin thư viện thôi.Ta chỉ việc thay libgreetings_enjavi.so trong tệp tin CMakeList.txt ở phần dưới bằng libgreetings_enjavi.a, ta vẫn build ở chỗ trên thôi.

Với tủ sách độngCấu trúc thư mục đang như sau:

oedev
OECrossDev:~/Code/CMake$ tree -L 2.├── build├── CMakeLists.txt├── include│ ├── greetings_en.h│ ├── greetings_es.h│ ├── greetings_ja.h│ └── greetings_vi.h├── lib│ └── libgreetings_enjavi.so└── src ├── greetings_es.c └── mainapp.cTa cũng cần sửa lại file CMakeList.txt nữaNó sẽ thành như vậy này:CMakeList.txt

## buộc ràng về version#cmake_minimum_required(VERSION 2.8.12)## thương hiệu project#project (multilang_greetings)## Khai báo địa điểm chưa thư viện (.so)#set (PROJECT_LINK_LIBS libgreetings_enjavi.so)link_directories(lib)## vị trí chưa các file header(.h)#include_directories(include)## Thêm source .c bởi lệnh set##set(SOURCES src/greetings_es.c)## Thêm source .c bằng file GLOB#file(GLOB SOURCES "src/*.c")## tệp tin chạy sẽ tiến hành tạo như vậy nào# sử dụng thư viện sẽ khai báo qua PROJECT_LINK_LIBS#add_executable(helloworld $SOURCES)target_link_libraries(helloworld $PROJECT_LINK_LIBS)Sau đó, ta cũng chạy CMakeMake để tạo thành file chạy:Kết trái của câu hỏi chạy CMake số đông vẫn vậy.Còn hiệu quả của Make sẽ như vậy này:

oedev
OECrossDev:~/Code/CMake/build$ makeScanning dependencies of target helloworld< 50%> Building C object CMakeFiles/helloworld.dir/src/mainapp.c.o<100%> Building C object CMakeFiles/helloworld.dir/src/greetings_es.c.oLinking C executable helloworld<100%> Built target helloworldFile chạy là helloworldKết quả chạy của file này sẽ như vậy này:

oedev
OECrossDev:~/Code/CMake/build$ ./helloworldHello worldKonichiwa!!!Xin chao !!!!Hola!!!Trên đây chỉ mô tả biện pháp dùng CMake với 1 ví dễ dàng và đơn giản trên Linux( tôi dung Ubuntu). Do bài viết đã vượt dài, tôi không diễn đạt cách áp dụng trên Window (cho Visual Studio) của CMake. Về cơ bản, bọn họ sẽ gồm một công tác CMake (có GUI) để trợ giúp việc export một source chứa file CMakeList.txt ra một thư mục cất project Visual Studio. Gồm mấy điểm chăm chú ở đây;

*

Thứ tự tiến hành sẽ là:

là thư mục đến source code, sẽ cất file CMakeList.txt là thư mục chứa cả project Visual Studio. để chọn loại Project vẫn export và các tham số kèm theo. giúp xem kết quả.

Xem thêm: Tại Sao Lông Mọc Ngược? Đâu Là Cách Làm Lông Mọc Dưới Da Trồi Lên

Chú ý ở đây là dù ta gồm export ra project rồi tuy nhiên source cơ mà project đó chưa hầu như ở dạng tham chiếu đến những file source chứa trong folder chọn bởi . Điều này tạo nên cho source ban sơ độc lập với project, dễ cập nhật khi đề xuất build trên những hệ điều hành. Tuy nhiên cần để ý khi dịch chuyển thư mục source đó.