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, intb)3 {4 return a+b;5 }

1 //so1.h

2 #ifndef _so1_h_3 #define _so1_h_

4

5 int add_fun(int a, intb);6 int fun_test(inta);7

8 #endif//_so1_h_

1 //so2/so2.h

2 #include

3 #include

4 #include "so1.h"

5

6 int fun_test(inta)7 {8 for (int i=0; i

13 return 0;14 }

1 //test/test.c

2 #include

3 #include

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)

# setmaketo a shared library

add_library(so1 SHARED ${so1})

1 # ./so2/CMakeLists.txt2

3 project(soTest)4 set(so2 so2.c)5 add_library(so2 SHARED ${so2})6

7 # link so18 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

命令运行后结果如下

linux cmake 编译项目,使用CMake构建复杂工程相关推荐

  1. CMake 编译项目时提示找不到依赖项

    编译项目时使用 CMake,当编译复杂时也容易出错,因此记录下以便后续参考: 项目 quic 基本情况: quic 依赖 boringssl 的 ssl.crypto 等,因此在 quic 的 CMa ...

  2. Linux使用cmake编译项目,如何使用cmake在linux中构建Qt项目(How to build Qt project in linux with cmake)...

    如何使用cmake在linux中构建Qt项目(How to build Qt project in linux with cmake) 我使用的是ubuntu 14.04,cmake 2.8.12.2 ...

  3. linux cmake 编译64位,cmake编译win下64位obs

    obs是一款开源编码推流工具,简单易用,非常流行. 一次项目中,发现本台式机I3处理器下32位obs推流CPU使用率100%.而使用的第三方设备在64位下,性能较好. 所以需要编译64位obs并且编译 ...

  4. Win10环境下用CMake编译项目遇到与Eigen库相关的问题

    原作者提供的CMakeLists.txt中 Eigen库是头文件库,不用编译也可以使用.如果Win系统的环境变量没有设置,也没有编译Eigen,find_package语句会找不到Eigen. fin ...

  5. Linux下CMAKE编译jsoncpp,使用CMake引入jsoncpp

    在jni的cpp中使用json,百度了一下,大多都是下面这个库,但是和之前的文档有点出入了,记录一下. jsoncpp库地址: 添加jsoncpp库 在cpp目录下创建一个jsoncpp目录 下载js ...

  6. 学习C++:C++进阶(三)CMake基础篇---用一个小型项目了解CMake及环境构建

    V1.1 于2022年7月15日第二次修改:添加了比较多的解释图,解读了各类库的CMakelist.txt文件 目录 第一部分 基础篇(Basics) 1.0 本部分主要学什么(Intro) 1.1 ...

  7. CMake编译工具与项目构建

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 文章导读 本文从C/C++代码的编译过程入手,弄清楚Make与Ma ...

  8. 一文详解CMake编译工具与项目构建

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 文章导读 本文从C/C++代码的编译过程入手,弄清楚Make与Makefile,CMake与CMake ...

  9. CMake入门教程【手册篇】CMake生成与编译项目

    CMake构建项目与编译过程 文章目录 1.CMake构建与编译项目流程 2.CMake支持的所有平台 3.编译运行指令 windows minggw windows visual studio wi ...

最新文章

  1. tcp、udp协议连接的建立和释放
  2. python进程线程处理模块_python程序中的线程操作 concurrent模块使用详解
  3. python语言的理解-使用Python语言理解递归
  4. Referenced file contains errors (http://www.springframework.org/schema...错误--转载
  5. FFMPEG结构体分析之AVCodecContext
  6. 给定0~N之间的N个数字(大于等于0,小于N,不重复)进行按小到大排列(不用其它的经典排序算法)
  7. [SQL入门级] 上篇被移出园子首页,那这篇咱就'薄利多销'
  8. C++算法学习(力扣:1003. 检查替换后的词是否有效)
  9. ReentrantLock释放锁源码
  10. 文档02_JavaScript
  11. 基于Flink建设流批一体实时数仓
  12. Android gpuimage美颜滤镜,GPUImage图片美颜
  13. QQ省市县三级联动JS
  14. 画PCB必备的3D元器件模型下载地址整理
  15. CAN通信----电路图
  16. 这里,陌生人发的动态比朋友圈有趣多了!
  17. linux越狱时手机怎么进入dfu,手动进入DFU模式并开始越狱
  18. 哪个牌子的运动耳机比较好、运动蓝牙耳机排行榜
  19. DeepSort论文学习
  20. 电脑儿童,【儿童玩电脑】儿童玩电脑好吗_儿童玩电脑的危害 - 妈妈网百科

热门文章

  1. COGS182 [USACO Jan07] 均衡队形[RMQ]
  2. FreeMarker笔记 前言第1章 入门
  3. Exchange收件人管理
  4. c语言程序设计课程设计学生信息管理系统,C语言程序设计课程设计报告----学生信息管理系统.doc...
  5. python中import的作用_python使用import报错是什么原因
  6. 统计指定目录下的视频时长
  7. plsql developer连接oracle--本地不安装oracle
  8. hadoop伪分布式(单机版)安装,Linux
  9. 插件translator_Zotero Jasminum 插件的更新记录
  10. [转载] java:比较运算符