linux cmake 编译项目,使用CMake构建复杂工程
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构建复杂工程相关推荐
- CMake 编译项目时提示找不到依赖项
编译项目时使用 CMake,当编译复杂时也容易出错,因此记录下以便后续参考: 项目 quic 基本情况: quic 依赖 boringssl 的 ssl.crypto 等,因此在 quic 的 CMa ...
- 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 ...
- linux cmake 编译64位,cmake编译win下64位obs
obs是一款开源编码推流工具,简单易用,非常流行. 一次项目中,发现本台式机I3处理器下32位obs推流CPU使用率100%.而使用的第三方设备在64位下,性能较好. 所以需要编译64位obs并且编译 ...
- Win10环境下用CMake编译项目遇到与Eigen库相关的问题
原作者提供的CMakeLists.txt中 Eigen库是头文件库,不用编译也可以使用.如果Win系统的环境变量没有设置,也没有编译Eigen,find_package语句会找不到Eigen. fin ...
- Linux下CMAKE编译jsoncpp,使用CMake引入jsoncpp
在jni的cpp中使用json,百度了一下,大多都是下面这个库,但是和之前的文档有点出入了,记录一下. jsoncpp库地址: 添加jsoncpp库 在cpp目录下创建一个jsoncpp目录 下载js ...
- 学习C++:C++进阶(三)CMake基础篇---用一个小型项目了解CMake及环境构建
V1.1 于2022年7月15日第二次修改:添加了比较多的解释图,解读了各类库的CMakelist.txt文件 目录 第一部分 基础篇(Basics) 1.0 本部分主要学什么(Intro) 1.1 ...
- CMake编译工具与项目构建
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 文章导读 本文从C/C++代码的编译过程入手,弄清楚Make与Ma ...
- 一文详解CMake编译工具与项目构建
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 文章导读 本文从C/C++代码的编译过程入手,弄清楚Make与Makefile,CMake与CMake ...
- CMake入门教程【手册篇】CMake生成与编译项目
CMake构建项目与编译过程 文章目录 1.CMake构建与编译项目流程 2.CMake支持的所有平台 3.编译运行指令 windows minggw windows visual studio wi ...
最新文章
- tcp、udp协议连接的建立和释放
- python进程线程处理模块_python程序中的线程操作 concurrent模块使用详解
- python语言的理解-使用Python语言理解递归
- Referenced file contains errors (http://www.springframework.org/schema...错误--转载
- FFMPEG结构体分析之AVCodecContext
- 给定0~N之间的N个数字(大于等于0,小于N,不重复)进行按小到大排列(不用其它的经典排序算法)
- [SQL入门级] 上篇被移出园子首页,那这篇咱就'薄利多销'
- C++算法学习(力扣:1003. 检查替换后的词是否有效)
- ReentrantLock释放锁源码
- 文档02_JavaScript
- 基于Flink建设流批一体实时数仓
- Android gpuimage美颜滤镜,GPUImage图片美颜
- QQ省市县三级联动JS
- 画PCB必备的3D元器件模型下载地址整理
- CAN通信----电路图
- 这里,陌生人发的动态比朋友圈有趣多了!
- linux越狱时手机怎么进入dfu,手动进入DFU模式并开始越狱
- 哪个牌子的运动耳机比较好、运动蓝牙耳机排行榜
- DeepSort论文学习
- 电脑儿童,【儿童玩电脑】儿童玩电脑好吗_儿童玩电脑的危害 - 妈妈网百科
热门文章
- COGS182 [USACO Jan07] 均衡队形[RMQ]
- FreeMarker笔记 前言第1章 入门
- Exchange收件人管理
- c语言程序设计课程设计学生信息管理系统,C语言程序设计课程设计报告----学生信息管理系统.doc...
- python中import的作用_python使用import报错是什么原因
- 统计指定目录下的视频时长
- plsql developer连接oracle--本地不安装oracle
- hadoop伪分布式(单机版)安装,Linux
- 插件translator_Zotero Jasminum 插件的更新记录
- [转载] java:比较运算符