Cmake基础知识讲解

2023-05-16

本文主要参考https://www.cnblogs.com/cv-pr/p/6206921.html
1.CMake编译原理
CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object))。因此CMake的编译基本就两个步骤:
cmake
make
cmake 指向CMakeLists.txt所在的目录,例如cmake … 表示CMakeLists.txt在当前目录的上一级目录。cmake后会生成很多编译的中间文件以及makefile文件,所以一般建议新建一个新的目录,专门用来编译,例如:
mkdir build
cd build
cmake …
make
make根据生成makefile文件,编译程序。
2.使用Cmake编译程序
我们编写一个关于开平方的C/C++程序项目,即b= sqrt(a),以此理解整个CMake编译的过程。
第1步,创建工程目录:

$ mkdir m_sqrt
$ cd m_sqrt/
$ mkdir build include  src 
$ touch CMakeLists.txt README

完了以后你的工程目录里应该是这样的:

同时include和src里的是:

第2步,开始配置这个工程
在终端运行$ gedit CMakelists.txt,粘贴以下代码:
编写CMakeLists.txt文件,该文件放在和src,include的同级目录,实际方哪里都可以,只要里面编写的路径能够正确指向就好了。CMakeLists.txt主要包含以下的7个步骤,具体的意义,请阅读相应的注释。

#1.cmake verson,指定cmake版本 
cmake_minimum_required(VERSION 3.2)

#2.project name,指定项目的名称,一般和项目的文件夹名称对应
PROJECT(test_sqrt)

#3.head file path,头文件目录
INCLUDE_DIRECTORIES(
include
)

#4.source directory,源文件目录
AUX_SOURCE_DIRECTORY(src DIR_SRCS)

#5.set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
SET(TEST_MATH
${DIR_SRCS}
)

#6.add executable file,添加要编译的可执行文件
ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH})

#7.add link library,添加可执行文件所需要的库,比如我们用到了libm.so(命名规则:lib+name+.so),就添加该库的名称
TARGET_LINK_LIBRARIES(${PROJECT_NAME} m)

第3步,编写代码
头文件b.h,如下所示:

#ifndef B_FILE_HEADER_INC
#define B_FIEL_HEADER_INC

#include<math.h>

double cal_sqrt(double value);

#endif

头文件b.c,如下所示:

#include "../include/b.h"

double cal_sqrt(double value)
{
    return sqrt(value);
}

main.c主函数,如下所示:

#include "../include/b.h"
#include <stdio.h>
int main(int argc, char** argv)
{
    double a = 49.0; 
    double b = 0.0;

    printf("input a:%f\n",a);
    b = cal_sqrt(a);
    printf("sqrt result:%f\n",b);
    return 0;
}

第四步、编译和运行程序
注意进入到build里

cd build
cmake ..
make

编译完,在build的目录下生成了一个可执行的文件test_sqrt,运行获取结果如下:

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

Cmake基础知识讲解 的相关文章

  • STM32学习之路(五---IIC)

    IIC是由数据线SDA和时钟SCL构成的串行总线 xff0c 可以发送和接收数据 在CPU与被控IC之间 xff0c IC与IC之间进行双向传送 IIC总线在传送数据过程中共有三种类型的信号 xff0c 分别是 xff1a 开始信号 xff
  • PWM调速的原理

    PWM调速实质上是调节占空比 xff0c 我们都是根据占空比的大小来衡量速度 xff0c 但是为什么我们调节占空比就可以实现对速度的调节呢 xff1f 这就需要我们了解调速的本质 xff0c 我们用PWM调节速度问什么能够实现 xff1f
  • keil中显示expected expression

    在keil中出现error expected expression的错误 xff0c 网上很多人都是在 Misc Cortrols这里改一下写c99就好了 xff0c 但是我改过之后还是没好 xff0c 依然报警告 xff0c 后来我自己的
  • Linux学习(C语言学习之Gcc)

    言之者无罪 xff0c 闻之者足以戒 诗序 Linux的学习需要对C语言有一个透彻性的了解 xff0c 需要有非常好的C语言基础 xff0c Gcc是Linux中的C文件的一个编译器 xff08 当然也不只局限于C文件 xff09 Gcc最
  • 如何在 python中查询某个函数的使用方法

    在Python 中查询某个函数的使用 方法时由两种途径 xff1a 1 利用help来查询 xff0c 比如用help来查询print内置函数的使用 xff0c 直接打开Shell输入 help print 就可以了 2 利用Python官
  • 玩转电机驱动——电机编码器

    玩转电机驱动 电机编码器 文章目录 玩转电机驱动 电机编码器前言一 旋转编码器1 光学编码器2 光学旋转编码器与Arduino连接3 程序 二 Arduino Encoder h库相关知识1 硬件要求2 基本用法3 了解正交编码信号4 示例
  • 6、SYSTEM文件夹介绍

    1 delay文件夹 delay c和delay h两个文件 xff0c 其中有七个函数 xff1a void delay osschedlock void void delay osschedunlock void void delay
  • 姿态估计0-06:DenseFusion(6D姿态估计)-源码解析(2)-linemod数据集,预处理解读

    以下链接是个人关于DenseFusion 6D姿态估计 所有见解 xff0c 如有错误欢迎大家指出 xff0c 我会第一时间纠正 有兴趣的朋友可以加微信 xff1a 17575010159 相互讨论技术 若是帮助到了你什么 xff0c 一定
  • 动作识别0-02:mmaction2(SlowFast)-官方数据训练测试-ucf101

    以下链接是个人关于mmaction2 SlowFast 动作识别 所有见解 xff0c 如有错误欢迎大家指出 xff0c 我会第一时间纠正 有兴趣的朋友可以加微信 xff1a 17575010159 相互讨论技术 若是帮助到了你什么 xff
  • 如何快速找到你想要的文献

    阅读文献是深入科研和跟随前沿发展的必要条件 xff0c 大家写论文的时候也需要查阅各种文献 xff0c 引证自己的观点 很多人并不太清楚下载文献的途径 xff0c 只简单了解图书馆 xff0c 知网 xff0c sci等 xff0c 多者使
  • java中private,public,protected详解

    参照甲骨文的java文档 xff1a 点击打开链接 访问级别 访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法 有两个级别的访问控制 xff1a 1 在顶级 public或package private xff08 没有显式修饰符
  • 史上最简SLAM零基础解读(10.1) - g2o(图优化)→简介环境搭建(slam十四讲第二版为例)

    本人讲解关于slam一系列文章汇总链接 史上最全slam从零开始 文末正下方中心提供了本人 联系方式 xff0c 点击本人照片即可显示 W X
  • (02)Cartographer源码无死角解析-(19) SensorBridge→雷达点云数据帧处理与坐标系变换(涉及函数重载)

    本人讲解关于slam一系列文章汇总链接 史上最全slam从零开始 xff0c 针对于本栏目讲解 02 Cartographer源码无死角解析 链接如下 02 Cartographer源码无死角解析 00 目录 最新无死角讲解 xff1a h
  • 目标检测0-02:YOLO V3-网络结构输入输出解析

    以下链接是个人关于YOLO V3所有见解 xff0c 如有错误欢迎大家指出 xff0c 我会第一时间纠正 xff0c 如有兴趣可以加微信 xff1a 17575010159 相互讨论技术 目标检测0 00 xff1a YOLO V3目录 史
  • arm, 任务调度,上下文切换,硬件软件

    1 hardware 1 1 The ARM architecture is a Reduced Instruction Set Computer RISC architecture with the following RISC arch
  • docker-registry相关知识

    私有仓库docker registry 一 关于registry xff1a 官方的Docker hub是一个用于管理公共镜像的好地方 xff0c 我们可以在上面找到我们想要的镜像 xff0c 也可以把我们自己的镜像推送上去 但是 xff0
  • javascript中的delete操作符

    delete 操作符用于删除对象的某个属性 xff1b 如果没有指向这个属性的引用 xff0c 那它最终会被释放 var Employee 61 firstname 34 John 34 lastname 34 Doe 34 console
  • 改善深度相机获取的深度图质量(稳定性)的trick

    用kinect或者realsense获取的深度图或者点云图 xff0c 由于传感器获取深度信息的不稳定性 xff0c 经常出现一张图里面 xff0c 有些深度信息丢失 xff0c 尤其是物体边缘 xff0c 因此怎么进行预处理得到较好的质量
  • 程序员裸辞如今找不到理想的工作,互联网寒冬该何去何从!

    互联网寒冬到临之际 xff0c 很多大厂出现裁人现象 xff0c 程序员们都瑟瑟发抖 就有一程序员表示自己从公司裸辞 xff0c 现在说的offer都不是很理想 xff0c 表示自己慌的一批 xff01 收到几个创业小公司的offer xf
  • 奇偶校验码原来这样算!!!

    数据传输的正误 数据发出方A像数据接收方B发送一串加密过后的情书 但是信息在传输过程中可能发生错误 比如某人截获并修改内容 一段美好的爱情就结束了 手动狗头 在电路传输中 电信号很容易受到干扰 电梯打电话你就知道了 于是我们要在原有的信息之

随机推荐