cmake的基本使用
前言
公司当前使用的都是cmake,之前没怎么用过,趁着项目间歇期专门学习一下,以此为记;
这次是有针对性的学习,所以都是通过各种例子来实现的;
cmake具体使用
一个cpp文件编译出一个可执行文件
文件目录
其中build是目录,是为了把cmake编译过程中产生的文件与源文件隔离而建立的,这就是cmake推荐使用的外部构建模式;
文件内容
main.cpp
#include <stdlib.h>
#include <stdio.h>int main() {printf("cmake test\n");return 1;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.5) #设置CMake最小版本
project (cmake_test) #设置工程名
add_executable(${PROJECT_NAME} main.cpp) #生成可执行文件 add_executable(cmake_test main.cpp)
编译
在build目录下先执行 cmake3 …(表示从build的上层目录去寻找CMakeLists.txt)去生成MakeFile文件,执行命令后的文件目录如下:
再在build目录下执行make命令,来进行真正的编译:
make执行后,可以在build目录下看到有 cmake_test 可执行文件的生成,至此完成该目标;
在后面的例子里,默认都是在工程目录下建立build目录并在该目录下生成MakeFile文件并生成可执行文件的——除非后面出现复杂情况,比如说在指定目录下生成时;
多级目录+多个cpp文件生成可执行文件
文件目录
可以看到,有2个cpp文件(main.cpp + src/my_class_1.cpp)和1个h文件(include/my_class_1.h)
文件内容
include/my_class_1.h
#ifndef _MY_CLASS_1_H_
#define _MY_CLASS_1_H_class My_Class_1 {public:My_Class_1();~My_Class_1();void class1_func();
};#endif
src/my_class_1.cpp
#include <iostream>
#include "my_class_1.h"My_Class_1::My_Class_1() {std::cout << "My_Class_1::My_Class_1" << std::endl;
}My_Class_1::~My_Class_1() {std::cout << "My_Class_1::~My_Class_1" << std::endl;
}void My_Class_1::class1_func() {std::cout << "My_Class_1::class1_func==> " << std::endl;
}
main.cpp
#include <stdlib.h>
#include <stdio.h>#include "my_class_1.h"int main() {printf("cmake test\n");My_Class_1 my_class_1_obj;my_class_1_obj.class1_func();return 1;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.5) #设置CMake最小版本project (cmake_test) #设置工程名set(SOURCES main.cpp src/my_class_1.cpp) #创建一个变量,名字叫SOURCE。它包含了所有的cpp文件。
#如果想把当前目录下的所有的cpp文件统一编译,可以使用: aux_source_directory(. SOURCES)
add_executable(${PROJECT_NAME} ${SOURCES}) #用所有的源文件生成一个可执行文件,因为这里定义了SOURCE变量,所以就不需要罗列cpp文件了target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/include) #设置生成这个可执行文件需要包含的头文件目录
多级目录+多个cpp文件分别生成动态库文件和可执行文件
文件目录
与上一个例子相比,文件目录未变;
文件内容
与上一个例子相比,仅有 CMakeLists.txt 的内容发生了变化,其他未变的不做说明;
CMakeLists.txt
cmake_minimum_required(VERSION 3.5) #设置CMake最小版本project (cmake_test) #设置工程名#Create a library 把my_class_1.cpp编译成一个动态库(名字是:libmyclass.so)
add_library(myclass SHARED src/my_class_1.cpp)#为这个动态库添加其编译所需的头文件目录
target_include_directories(myclass PUBLIC ${PROJECT_SOURCE_DIR}/include)#生成可执行文件
add_executable(${PROJECT_NAME} main.cpp)#链接库和可执行文件
target_link_libraries(${PROJECT_NAME} PRIVATE myclass)
编译
重新生成MakeFile并编译后,可以看到在build目录下生成了 libmyclass.so 动态库;
在指定目录生成动态库文件和可执行文件
文件目录
与上一个例子相比,文件目录未变;
文件内容
与上一个例子相比,仅有 CMakeLists.txt 的内容发生了变化,其他未变的不做说明;
CMakeLists.txt
cmake_minimum_required(VERSION 3.5) #设置CMake最小版本#设置工程名
project (cmake_test) #设置可执行文件的输出目录
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)#设置库文件的输出目录
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)# Create a library 把my_class_1.cpp编译成一个动态库(名字是:libmyclass.so)
add_library(myclass SHARED src/my_class_1.cpp)#为这个动态库添加其编译所需的头文件目录
target_include_directories(myclass PUBLIC ${PROJECT_SOURCE_DIR}/include)#生成可执行文件
add_executable(${PROJECT_NAME} main.cpp)#设置动态链接库目录
link_libraries(${PROJECT_SOURCE_DIR}/lib)#链接库和可执行文件
target_link_libraries(${PROJECT_NAME} PRIVATE myclass)
相比较于上个例子,只是指定了生成动态库和可执行文件的目录:动态库是在工程目录的lib目录下,可执行文件在工程目录的bin目录下;是通过下面两句话来实现设置的:
#设置可执行文件的输出目录
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)#设置库文件的输出目录
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
参考
RoboMaster视觉教程CMake
cmake的基本使用相关推荐
- TVM cmake示例展示
TVM cmake示例展示 本文展示tvm/cmake中config.cmake,tvm/cmake/module/LLVM.cmake,tvm/cmake/module/CUDA.cmake,tvm ...
- VScode配置CMAKE文件
创建一个vscode文件 记得一定要创建一个build文件夹,因为cmake编译过程中产生的中间文件会放到build文件夹中. 打开VScode 配置文件 launch.json {"ver ...
- PCL1.9的PCLConfig.cmake文件找不到eigen等外部依赖
PCL1.9的PCLConfig.cmake文件找不到eigen等外部依赖 由于需要用到PCL中on_nurbs模块做拟合,但是ros自带的pcl中没有该模块.所以源码安装了PCL 1.9,但是在使用 ...
- ++项目 cmake头文件路径_CMAKE入门实战
0.导语 最近做的项目使用CLION构建,而这个采用CMakeLists.txt管理,因此为了更好的学习,故找到了一篇大牛级别的入门文章,有文章有代码,本文是花了一点时间把这篇文章学习后的重要点记录吧 ...
- cmake java_JNI系列之AS支持CMake了
写在前面 Android Studio 2.2+已支持CMake编译,与以前NDK-Build方式相比方便了不少,本文旨在引导大家在AS2.2+下一步一步建立JNI工程进行开发,并假设大家已经对JNI ...
- cmake开发环境 linux qt_一步步搭建CMake+QT+VTK+BOOST开发环境
开发环境: 1.可以迅速处理大量并发网络数据包,ASIO库和winpcap 4.1.3库; 2.处理与显示点云模型数据,使用VTK 8.2.0库; 3.项目使用CMake+VC2017编译,GUI使用 ...
- 在Ubuntu18.04下的Cmake使用记录
(1)首先是安装cmake.命令如下: sudo apt-get install cmake (2)创建一个源程序,1.cpp如下:(1.cpp的位置是位于hoem/ysh/code) #includ ...
- CMake结合PCL库学习(2)
紧接着上一篇文章 对于PCL 库中的各个模块之间是有相互依赖关系的 其中Common模块是最基础的模块,其中是定义各种数据结构的头文件,所以Common这个模块是不需要依赖性响的,但是IO 模块就是需 ...
- CMake结合PCL库学习(1)
经常会有有人问到CMake的学习的问题,而且网上也有很多博客是介绍学习CMake 的用法,但是我觉的学习不用这样死板,用到了就顺便学习一下,也就是边做边学,由浅入深,慢慢的就会熟悉了,这个学习的过程中 ...
- 在CentOS 6.3/6.6 64bit上源码安装cmake 3.4.0
CMake主页是 https://cmake.org/download/ 1.安装必备包 yum install -y gcc gcc-c++ make automake ncurses-devel ...
最新文章
- Hadoop学习之MapReduce(一)
- 如何通过 Serverless 轻松识别验证码?
- 【视频课】如何掌握好深度学习之视频分类与行为识别?这一门课足矣!
- GCD dispatch_semaphore
- 极乐技术周报(第十六期)
- Python得到n个从start到end的不重复随机数(set实现)
- 小猪短租陈驰:共享经济不是简单的资本游戏
- 视频如何批量去除水印
- 字节跳动社招校招实习内推提前批
- torch.randn用法以及小案例
- 用天球星座测量地球表面经纬度的方法
- 工作经费的开支范围_经费开支范围
- eclipse开发安卓android程序环境
- Tomcat无法自动解压缩webapps下的war包
- 19-你知道哪几种锁?分别有什么特点?
- ExtJS6图表简单demo(折线图,散点图,柱状图)
- 权重衰退(PyTorch)
- 我的操作系统探索之路----------------进程篇(1)
- 智点创科机器人_校园里来了个机器人——智点创科天才学院走进祥阁学校
- java导出ansi csv_我也太牛了,解决了浏览器中,前台导出csv格式,UTF
热门文章
- 关于使用HandlerThread获取数据,并实现sqlite分页。
- 动手学深度学习-pytorch 导入d2lzh_pytorch模块时报错 No moudel named 'd2lzh_pytorch'
- android端音视频同步
- Linux ln -sf 的用法
- 叮咚谁呀我是送信的邮递员呀_幼师必备|幼儿园冬季室内游戏
- 火山PC枚举文件和枚举目录
- 安装ubuntu或deepin报:failed to load ldlinux.c32的问题及解决步骤
- luogu1010:幂次方
- Linux搭建TFTP服务
- quickpcb添加pcb库_QuickPcb2005元件库(QuickPcb集成元件库)V1.0 最新版