程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 運用CMake構建復雜工程

運用CMake構建復雜工程

編輯:關於C++

運用CMake構建復雜工程。本站提示廣大學習愛好者:(運用CMake構建復雜工程)文章只能為提供參考,不一定能成為您想要的結果。以下是運用CMake構建復雜工程正文


本文中一切代碼:https://git.coding.net/autophyte/soTest.git


 

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)=%d\n", 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

  命令運轉後後果如下

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved