CMake、CMakeLists.txt

2023-05-16

2022-06-02,今天开始研究cmake。不间断更新。
在这里插入图片描述

一、说明

0.官方文档网址:www.cmake.org

1.cmake的定义:高级编译配置工具
当多个人用不同的语言或者编译器开发一个项目,最终要输出一个可执行文件或者共享库(dll、so),这时候就出现了神器CMake! 所有的操作都是通过编译CMakeLists.txt来完成的。
学习CMake的目的,是为将来处理大型的C/C++/JAVA项目做准备。

2.安装

sudo apt-get install cmake

二、使用步骤

1.构建CMakeLists.txt
CMake 构建脚本是一个纯文本文件,您必须将其命名为 CMakeLists.txt,并在其中包含 CMake 构建您的 C/C++ 库时需要使用的命令。如果您的原生源代码文件还没有 CMake 构建脚本,您需要自行创建一个,并在其中包含适当的 CMake 命令。

2.在包含CMakeLists.txt的目录下使用cmake

cmake 放置CMakeList.txt路径

1)构建放在当前目录下(内部构建):cmake . 即在当前目录cmake,在当前目录build。
2)在当前目录下创建build文件夹存放构建文件(外部构建),build内输入cmake ..。即在上级目录cmake,在该目录下build。
结果:生成4个东西:CMakeFiles文件夹、cmake_install.cmake、CMakeCache.txt、Makefile

只要产生Makefile文件,就说明cmake成功了

3.在包含Makefile的目录下使用make
直接在build出4个东西的目录下(命令针对的是Makefile)输入make

make

4.生成可执行文件。 输入./文件名运行



举例1:
1)先编写main.cpp

#include <iostream>
using namespace std;
int main(){
	cout<<"hello,world"<<endl;
	return 0;
}

2)编写CMakeLists.txt

PROJECT(HELLO)            #工程名为HEELO

SET(SRC_LIST main.cpp)    #变量SRC_LIST包含main.cpp

MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})

MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR})

ADD_EXECUTABLE(hello ${SRC_LIST}) #生成可执行程序文件名为hello,源文件读取变量SRC_LIST中内容

3)cmake

cmake .

生成了4个东西:CMakeFiles文件夹、cmake_install.cmake、CMakeCache.txt、Makefile

4)make

make

生成了可执行文件hello

5)执行

./hello

显示"hello,world"


三、如何编写CMakeLists.txt,语法详解

PROJECT关键字 ※

可以用来指定工程的名字和支持的语言,默认支持所有语言
PROJECT(HELLO) 指定了工程的名字为HELLO,且支持所有语言(建议这样做)
PROJECT(HELLO CXX)指定了工程的名字为HELLO,仅支持C++语言
PROJECT(HELLO C CXX)指定了工程的名字为HELLO,仅支持C和C++语言

该指定隐式地定义了两个CMake变了
<projectname>_BINARY_DIR
<projectname>_SOURCE_DIR
本例中是HELLO_BINARY_DIR、HELLO_SOURCE_DIR
MESSAGE关键字就可以直接使用这两个变量。当前都指向当前的工作目录

SET关键字

SET用来显式的指定变量,可以为多个
SET(SRC_LIST main.cpp) 意为SRC_LIST变量包含了main.cpp
SET(SRC_LIST main.cpp test1.cpp test2.cpp) 意为SRC_LIST变量包含了main.cpp、test1.cpp、test2.cpp

MESSAGE关键字

向终端输出用户自定义的信息,主要包含三种:

  • SEND_ERROR:产生错误,生成过程被跳过
  • STATUS:输出前缀为- -的信息
  • FATAL_ERROR:立即终止所有cmake过程

ADD_EXECUTABLE关键字 ※

生成可执行文件
ADD_EXECUTABLE(hello $(SRC_LIST)),生成的可执行文件名为hello,源文件读取变量SRC_LIST中的内容
也可直接写为 ADD_EXECUTABLE(hello main.cpp)

注意:工程名的HELLO和生成的可执行文件hello是没有任何关系的

所以,上例中的5行CMakeLists.txt可以简化为2行:

PROJECT(HELLO)
ADD_EXECUTABLE(hello main.cpp)

ADD_SUBDIRECTORY关键字

①有子目录时,要用ADD_SUBDIRECTORY关键字包含所有需要访问的子文件夹。除了工程目录外,每个被访问的子目录里也都需要有一个CMakeLists.txt说明
将目标文件放入构建目录的bin子目录ADD_SUBDIRECTOR(子目录名 bin):自动在子目录下新建一个名为bin的子目录,存放中间二进制文件、目标二进制文件、库文件。

注意:文件就是file。目录(文件夹)就是directory。

语法基本原则

1.变量取值 ${ }
2.分隔多个文件:空格或者分号
3.大小写:指令大小写不敏感,参数和变量对大小写敏感

四、内部构建与外部构建

内部构建:例1就是内部构建,产生的临时文件和源文件堆在一起,不方便清理。BINARY DIR和SOURCE DIR在同一个目录下。
外部构建:把生成的临时文件放在build目录下,方便清理(直接删除build整个文件夹)。BINARY DIR在build目录下,SOURCE DIR在CMakeLists.txt目录下(一般CMakeLists.txt是在build的上级目录,这样可以直接cmake …,然后make)。将build放在CMakeLists.txt同级目录下。推荐使用外部构建。
在这里插入图片描述

五、让Hello,World看起来更像一个工程

  • 为工程添加一个子目录src,用来放置工程源代码
  • 为工程添加一个子目录doc,用来放置工程的文档hello.txt
  • 为工程添加文本文件使用文档README版权COPYRIGHT
  • 在工程目录中添加一个runhello.sh脚本,用来调用hello二进制
  • 为工程添加一个子目录bin,用来放置生成的目标文件

举例2:
1)在工程目录下,先编写main.cpp。创建src子目录,将main.cpp放入其中

#include <iostream>
using namespace std;
int main(){
	cout<<"hello,world"<<endl;
	return 0;
}

2)在工程目录下编写CMakeLists.txt,包含子目录版本

PROJECT(HELLO )            #工程名为HEELO
ADD_SUBDIRECTORY(src bin)  #源文件包含子目录src,目标文件放在构建文件的bin目录下

3)在源文件目录src下编写子目录的CMakeLists.txt

ADD_EXECUTABLE(hello main.cpp)

4)在工程目录下构建子目录build,并在build中进行cmake。出现Makefile后再进行make

mkdir build        
cd build
cmake ..  #出现5个东西:bin  CMakeCache.txt  CMakeFiles  cmake_install.cmake  Makefile
make      #bin目录中出现了可执行文件hello

只进行到mkdir build时,对工程目录进行tree。效果(目录结构)应该是这样的:
.
├── build
├── CMakeLists.txt
└── src
 ├── CMakeLists.txt
 └── main.cpp

六、安装:INSTALL

(一) 安装文件

INSTALL(FILES 文件名 DESTINATION 目标地址)
举例3:
工程目录下的CMakeLists.txt添加一行:

INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake)   #会自动安装到/usr/local/share/doc/cmake下

DESTINATION后面:
1.写绝对路径
2.相对路径:
CMAKE_INSTALL_PREFIX 默认是在/usr/local/
若想要更改,可以手动设置

set(CMAKE_INSTALL_PREFIX "目标路径")

这时候再 DESTINATION ${CMAKE_INSTALL_PREFIX},就导出到目标路径上了。

(二)安装脚本

PROGRAMS:非目标文件的可执行程序安装(比如脚本之类)

INSTALL(PROGRAMS runhello.sh DESTINATION bin)    #实际安装到/usr/bin

(三)安装目录

安装doc中的hello.txt
方法一:通过在doc目录中建立CMakeLists.txt,通过install下的file
方法二:直接在工程目录中写入

INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake)

(四)可执行文件安装

在src的CMakeLists.txt里输入

INSTALL(TARGETS hello DESTINATION bin) 

(五)执行

cd build
cmake ..
make
make install

七、生成静态库和动态库

SET(变量 源文件名)
ADD_LIBRARY(库名 STATIC或SHARED ${变量})

(一)构建动态库(命令用SHARED) (构建静态库,命令用STATIC)

举例4:

SET(LIBHELLO_SRC hello.cpp)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})    #生成动态库libhello.so

1)构建目录树
.
├── build
├── CMakeLists.txt
└── src
├── CMakeLists.txt
├── hello.cpp
└── hello.h

2 directories, 4 files

2)编写CMakeLists.txt
①工程目录CMakeLists.txt内容为:

cmake_minimum_required(VERSION 3.13)
PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)

②lib目录CMakeLists.txt内容为:

SET(LIBHELLO_SRC hello.cpp)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

3)lib下源文件内容
①hello.h内容

#ifndef HELLO_H
#define HELLO_H

void HelloFunc();

#endif

②hello.cpp内容

#include "hello.h"
#include <iostream>

using namespace std;

void HelloFunc(){
        cout<<"Hello,world!"<<endl;
}

4)在build目录下进行cmake … 、make 。在build/bin下即出现了libhello.so

(二)同时构建静态库和动态库

SET_TARGET_PROPERTIES

3行命令。视频里补充

八、使用外部头文件和共享库

(一)添加头文件搜索路径:

INCLUDE_DIRECTORIES(路径)

(二)添加需要链接的共享库

TARGET_LINK_LIBRARIES(源文件名 库名)
TARGET_LINK_LIBRARIES(main libhello.so)    #链接动态库
TARGET_LINK_LIBRARIES(main libhello.a)     #链接静态库




本文参考:b站刘贝斯《从零开始介绍CMake》
转一篇参考:https://blog.csdn.net/wml00876/article/details/120965558

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake、CMakeLists.txt 的相关文章

随机推荐

  • Kubernetes 镜像仓库 k8s.gcr.io 将于 2023 年 4 月 3 日冻结

    公众号关注 奇妙的 Linux 世界 设为 星标 xff0c 每天带你玩转 Linux xff01 2023 年 4 月 3 日 xff0c 旧镜像仓库 k8s gcr io 将被冻结 xff0c Kubernetes 和相关子项目的镜像将
  • 全网最详保姆级 Kubernetes 应用调试中文指南,专治各种疑难杂症

    公众号关注 奇妙的 Linux 世界 设为 星标 xff0c 每天带你玩转 Linux xff01 现如今已经全面进入了云原生时代 xff0c 不论是从软件架构 开发模式又或者是在部署方式上 xff0c 它们和传统模式相比较而言 xff0c
  • 如何使用手机微信实时查看安防网络摄像头直播?

    随着移动通信设备的普及 xff0c 传统监控如幼儿园 农场 养殖场 交通等信息 xff0c 都开始尝试通过手机微信进行直播 xff0c 实现随时随地 想看就看的需求 xff0c 具体如何实现 xff1f 实现难度如何 xff1f 本文就为大
  • 【米哈游】2022春季校园招聘

    作者 xff1a 咖喱吉吉 链接 xff1a 米哈游 2022春季校园招聘网申开始啦 xff01 校园大使内推 招聘信息 牛客网 来源 xff1a 牛客网 在这里有超多业界顶尖游戏制作大牛 xff0c 等你一起来创作最激动人心的面向未来的产
  • INT,INT32,_int64的范围

    在做游戏的开发中 xff0c 由于游戏运行的时间已经很长 xff0c 数据量非常大 xff0c 在内网测试 xff0c 怎么测都没有问题 xff0c 可是到外网就是时不时的挂了 xff0c 后来打log才看出问题 是我的int类型范围设置小
  • 内存分配函数

    1 malloc 函数 xff1a void malloc unsigned int size 在内存的动态分配区域中分配一个长度为size的连续空间 xff0c 如果分配成功 xff0c 则返回所分配内存空间的首地址 xff0c 否则返回
  • ORB_SLAM2+realsense运行稠密建图

    具体的环境及其细节 xff1a Ubuntu18 04 realsenseD435i ROS orbslam2 echo gou的博客 CSDN博客 下载代码 xff1a https github com gaoxiang12 ORBSLA
  • catkin_make学习总结

    catkin make学习总结 基础概念常用函数理解与注释其他有用的函数总结简单实例参考链接 基础概念 CMakeLists txt 文件中 xff0c 命令名字是不区分大小写的 xff0c 而参数和变量是大小写相关的ros的包 catki
  • 新手如何使用立创EDA完成电路设计

    软件简介 xff1a 立创EDA是一款基于浏览器的免费国产EDA绘图工具 下载方式 xff1a 百度 立创EDA 进入主页 xff0c 或主页点击 下载 客户端 xff0c 支持Wndows Luixus Mac系统下载安装 首先 xff0
  • Echart、Excel、highcharts、jfreechart对比

    Echart Excel highcharts jfreechart 柱状图 条形图 折线图 面积图 散点图 气泡图 K 线图 饼图 环形图 雷达图 力导布局图 和弦图 曲面图 地图
  • HAL库和标准库的区别

    本文回答来源于chat gpt4 xff0c 非原创 xff0c 也是我初学过程中所遇到的问题 xff0c 答案分享给大家 xff0c 如有侵权请联系删除 xff1a HAL 库 xff08 Hardware Abstraction Lay
  • 原来手机就能直接制作证件照,我也才知道,再也不用去照相馆了

    证件照选相信是我们大家日常所需 xff0c 但是去照相馆真的有点麻烦 xff0c 尤其是有时候仅仅只是需要换一个背景颜色 xff0c 其实不用这么麻烦 xff0c 现在手机上不仅能换背景颜色 xff0c 还能制作证件照 xff0c 还很简单
  • RTK基站 差分云共享技术,全套高精度定位解决方案

    针对区域内多个移动体高精度定位的需求 xff0c 为了最大程度的降低成本 xff0c FDISYSTEMS为DETA100系列具有联网功能的产品提供了免费的差分共享技术 xff0c 通过该技术可以将单一运载体从CORS服务器获取的差分修正R
  • STM32 Keil编程常见问题解决办法:(一)多行注释时出现红色下划线

    Problem xff1a 在STM32 Keil软件中进行多行注释时出现下图所示现象 xff0c 部分语句出现红色下划线 Solution xff1a 点击Keil软件上的小扳手 选择Text Completion 勾选ENTER TAB
  • 2017秋招求职历程总结

    2017秋招求职历程总结 从小的梦想就是有朝一日能够进入汽车行业工作 xff0c 很幸运刚毕业的第一份工作便实现了此梦想 xff0c 感谢大学遇到的那些人 终于在国庆之前拿到了一份还算满意的offer 9月1号从实习单位离职准备接下来的秋招
  • Win10常用命令:定时关机(shutdown命令)

    文章目录 一 单次 定时关机 xff1a Win 43 R 输入命令 xff1a 二 shutdown命令参数三 每天定时关机 一 单次 定时关机 xff1a Win 43 R 输入命令 xff1a 倒计时关机 xff1a shutdown
  • 如何实现超大文件(60G)传输给别人?

    2022 4 25 今天Ken问我要我工位上的一个虚拟机环境 xff0c 整个文件夹拷给他 但是这个CentOS的环境有60个G xff0c 我的U盘只有45G 想了几个办法 xff1a 压缩包 xff1a 用WinRAR压缩成压缩包 xf
  • CPU两大架构:X86与ARM的区别

    1 CPU 架构 Central Processing Unit Architecture X86 ARM MIPS PowerPC IA64 AMD64 x86 64 x64 是64位的CPU架构 区分ARM64 2 复杂指令集计算机CI
  • Linux(UOS、Ubuntu)虚拟机和Windows物理机之间无法复制粘贴

    我的UOS虚拟机和主机之间无法复制粘贴 xff0c 解决方案如下 xff1a 1 先更新一下软件列表 span class token function sudo span span class token function apt get
  • CMake、CMakeLists.txt

    2022 06 02 xff0c 今天开始研究cmake 不间断更新 一 说明 0 官方文档网址 xff1a www cmake org 1 cmake的定义 xff1a 高级编译配置工具 当多个人用不同的语言或者编译器开发一个项目 xff