前言

公司当前使用的都是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的基本使用相关推荐

  1. TVM cmake示例展示

    TVM cmake示例展示 本文展示tvm/cmake中config.cmake,tvm/cmake/module/LLVM.cmake,tvm/cmake/module/CUDA.cmake,tvm ...

  2. VScode配置CMAKE文件

    创建一个vscode文件 记得一定要创建一个build文件夹,因为cmake编译过程中产生的中间文件会放到build文件夹中. 打开VScode 配置文件 launch.json {"ver ...

  3. PCL1.9的PCLConfig.cmake文件找不到eigen等外部依赖

    PCL1.9的PCLConfig.cmake文件找不到eigen等外部依赖 由于需要用到PCL中on_nurbs模块做拟合,但是ros自带的pcl中没有该模块.所以源码安装了PCL 1.9,但是在使用 ...

  4. ++项目 cmake头文件路径_CMAKE入门实战

    0.导语 最近做的项目使用CLION构建,而这个采用CMakeLists.txt管理,因此为了更好的学习,故找到了一篇大牛级别的入门文章,有文章有代码,本文是花了一点时间把这篇文章学习后的重要点记录吧 ...

  5. cmake java_JNI系列之AS支持CMake了

    写在前面 Android Studio 2.2+已支持CMake编译,与以前NDK-Build方式相比方便了不少,本文旨在引导大家在AS2.2+下一步一步建立JNI工程进行开发,并假设大家已经对JNI ...

  6. cmake开发环境 linux qt_一步步搭建CMake+QT+VTK+BOOST开发环境

    开发环境: 1.可以迅速处理大量并发网络数据包,ASIO库和winpcap 4.1.3库; 2.处理与显示点云模型数据,使用VTK 8.2.0库; 3.项目使用CMake+VC2017编译,GUI使用 ...

  7. 在Ubuntu18.04下的Cmake使用记录

    (1)首先是安装cmake.命令如下: sudo apt-get install cmake (2)创建一个源程序,1.cpp如下:(1.cpp的位置是位于hoem/ysh/code) #includ ...

  8. CMake结合PCL库学习(2)

    紧接着上一篇文章 对于PCL 库中的各个模块之间是有相互依赖关系的 其中Common模块是最基础的模块,其中是定义各种数据结构的头文件,所以Common这个模块是不需要依赖性响的,但是IO 模块就是需 ...

  9. CMake结合PCL库学习(1)

    经常会有有人问到CMake的学习的问题,而且网上也有很多博客是介绍学习CMake 的用法,但是我觉的学习不用这样死板,用到了就顺便学习一下,也就是边做边学,由浅入深,慢慢的就会熟悉了,这个学习的过程中 ...

  10. 在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 ...

最新文章

  1. Hadoop学习之MapReduce(一)
  2. 如何通过 Serverless 轻松识别验证码?
  3. 【视频课】如何掌握好深度学习之视频分类与行为识别?这一门课足矣!
  4. GCD dispatch_semaphore
  5. 极乐技术周报(第十六期)
  6. Python得到n个从start到end的不重复随机数(set实现)
  7. 小猪短租陈驰:共享经济不是简单的资本游戏
  8. 视频如何批量去除水印
  9. 字节跳动社招校招实习内推提前批
  10. torch.randn用法以及小案例
  11. 用天球星座测量地球表面经纬度的方法
  12. 工作经费的开支范围_经费开支范围
  13. eclipse开发安卓android程序环境
  14. Tomcat无法自动解压缩webapps下的war包
  15. 19-你知道哪几种锁?分别有什么特点?
  16. ExtJS6图表简单demo(折线图,散点图,柱状图)
  17. 权重衰退(PyTorch)
  18. 我的操作系统探索之路----------------进程篇(1)
  19. 智点创科机器人_校园里来了个机器人——智点创科天才学院走进祥阁学校
  20. java导出ansi csv_我也太牛了,解决了浏览器中,前台导出csv格式,UTF

热门文章

  1. 关于使用HandlerThread获取数据,并实现sqlite分页。
  2. 动手学深度学习-pytorch 导入d2lzh_pytorch模块时报错 No moudel named 'd2lzh_pytorch'
  3. android端音视频同步
  4. Linux ln -sf 的用法
  5. 叮咚谁呀我是送信的邮递员呀_幼师必备|幼儿园冬季室内游戏
  6. 火山PC枚举文件和枚举目录
  7. 安装ubuntu或deepin报:failed to load ldlinux.c32的问题及解决步骤
  8. luogu1010:幂次方
  9. Linux搭建TFTP服务
  10. quickpcb添加pcb库_QuickPcb2005元件库(QuickPcb集成元件库)V1.0 最新版