首頁 > 軟體

使用CMake構建複雜工程

2020-06-16 17:26:35

0. 什麼是CMake

  CMake是一個跨平台的編譯、安裝、測試以及打包工具;CMake不直接編譯軟體,而是結合原生構建系統來構建軟體。CMake組態檔是CMakeList.txt檔案(每個原始碼資料夾下都要有一個),CMake根據組態檔在生成Unix的Makefile或VS的solution檔案等。

1. 為什麼選CMake

  別人為什麼選CMake我不清楚,我是因為在Linux上直接寫Makefile太痛苦,而專案又會跨平台,Windows和Linux都要有

2. 用一個簡單工程來說明CMake用法。

  • 工程名soTest,裡面包含一個兩個so(dll)檔案:so1和so2,以及一個測試工程st
  • 工程內檔案結構如下:
    • 檔案so1/so1.c:用於生成libso1.so
    • 檔案so2/so2.c:用於生成libso2.so,依賴於libso1.so,會呼叫libso1.so內函數
    • 檔案test/test.c:生成可執行檔案,呼叫libso2.so,呼叫libso2.so內函數
    • 檔案test/test.py:使用Python呼叫libso2.so函數
    • build目錄用於存放編譯時和種檔案,這樣可以保持原始碼資料夾乾淨
    • 檔案結構
    • 可以看,每個目錄下都有一個CMakeList.txt的檔案,這些檔案就是CMake的組態檔,CMake就是根據這些檔案來生成其他構建檔案的

3. 專案程式碼如下:

1 // so1/so1.c
2 int add_fun(int a, int b)
3 {
4     return a+b;
5 }
 
1 // so1.h
2 #ifndef _so1_h_
3 #define _so1_h_
4 
5 int add_fun(int a, int b);
6 int fun_test(int a);
7 
8 #endif//_so1_h_
 
 
 1 // so2/so2.h
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include "so1.h"
 5 
 6 int fun_test(int a)
 7 {
 8     for (int i=0; i<a; ++i)
 9     {
10         printf("add_fun(%d+%d)=%dn", i, i, add_fun(i, i));
11     }
12     
13     return 0;
14 }
 
 
 1 // test/test.c
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 
 5 #include "so1.h"
 6 
 7 int main(int argc, char **argv)
 8 {
 9     return fun_test(9);
10 }
 
 
 1 # ./CMakeLists.txt,工程總組態檔
 2 
 3 # 最低版本要求,必須
 4 cmake_minimum_required(VERSION 3.0)
 5 
 6 # 工程名稱,這裡用soTest這個名字
 7 project(soTest)
 8 
 9 # 新增include目錄,本例中關檔案在./下,所以直接取${PROJECT_SOURCE_DIR}/
10 include_directories(${PROJECT_SOURCE_DIR}/)
11 
12 # 新增連結庫查詢目錄,庫查詢序按照引數順序從向右查
13 link_directories(${PROJECT_BINARY_DIR}/libs /usr.local/libs /usr/lib)
14 
15 # 設定生成的庫檔案目錄,這裡我們設定成和庫目錄相同
16 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/libs)
17 
18 # 設定可執行檔案目錄,同樣設成和庫目錄相同
19 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/libs)
20 
21 # 新增子目錄(每個子目錄下都必須有自已的CMakeLists.txt檔案
22 add_subdirectory(so1)
23 add_subdirectory(so2)
24 add_subdirectory(test)
 
 
# ./so1/CMakeLists.txt
# project name: soTest
project(soTest)

# set source files
set(so1 so1.c)

# set make to a shared library
add_library(so1 SHARED ${so1})
 
 
 1 # ./so2/CMakeLists.txt
 2 
 3 project(soTest)
 4 set(so2 so2.c)
 5 add_library(so2 SHARED ${so2})
 6 
 7 # link so1
 8 target_link_libraries(so2 so1)
 
 
1 project(soTest)
2 set(st test.c)
3 
4 # 生成可執行檔案
5 add_executable(st test.c)
6 target_link_libraries(st so2 so1)

4. CMake支援在原始檔目錄外進行構建,這裡我們選擇在./build目錄下進行構建,好處是不會把原始檔目錄汙染,在build目錄下執行命令(命令後引數是總CMakeLists.txt檔案所在目錄):

cmake .. && make && ./libs/st

  命令執行後結果如下

  

使用cmake編譯安裝MySQL 5.5  http://www.linuxidc.com/Linux/2015-12/126541.htm   

CMake快速使用教學 http://www.linuxidc.com/Linux/2015-10/124447.htm

Ubuntu 12.04利用CMake-2.8.10.4編譯OpenCV-2.4.4 http://www.linuxidc.com/Linux/2014-04/100113.htm

CMake並沒有想象中好用 http://www.linuxidc.com/Linux/2014-03/98799.htm

CMake 設定交叉編譯環境 http://www.linuxidc.com/Linux/2014-03/98622.htm

MySQL編譯安裝 之 CMake http://www.linuxidc.com/Linux/2013-09/90113.htm

基於CMake編譯安裝MySQL 5.5  http://www.linuxidc.com/Linux/2013-04/83579.htm

CMake基礎教學  http://www.linuxidc.com/Linux/2016-05/131618.htm


IT145.com E-mail:sddin#qq.com