使用CMake构建复杂工程
2018-06-18 04:11:49来源:未知 阅读 ()
本文中所有代码: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
命令运行后结果如下
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 在名称空间中使用using声明和using编译指令 2020-05-29
- 1.ffmpeg、ffplay、ffprobe命令使用 2020-05-11
- 关于使用ffmpeg的一些牢骚 2020-05-08
- G++编译链接的那些事!G++的特殊使用方法[常用] 2020-04-19
- c/c++ 使用valgrind检查内存泄漏 2020-04-14
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash