運用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用法。
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
命令運轉後後果如下