0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

cmake学习的总结(一)

电子设计 来源:电子设计 作者:电子设计 2020-12-24 18:03 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

大家晚上好,在这里祝大家端午安康。今天给大家分享的是工程管理工具cmake,没有先介绍makefile工程管理工具(坦白来说,这两者都差不多,cmake最终还是会生成Makefile的,只是说cmake语法稍微比较简单一些,没有Makefile那么复杂!)。就自己个人经历,现在一般公司去写Makefile和cmake的比较少(当然去招聘网站上,有的时候还是可以看到有这个技能要求会写的,所以说能够自己写出来是最为完美的!),一般都是直接使用厂家的Makefile或者Cmake;但作为学习,还是要认真学习里面的原理,比如出现了错误,你要能够定位到错误并把它解决掉,因为可能错误就出现在配置好的Makefile或者Cmake里面,所以你要看的懂里面代码的意思(也就是说,你知道这个工具是这样用,但是也要明白它的原理机制,做到之知其然,知其所以个然来!),这样才能把问题解决掉。

而且就个人见解,在传统的linux工程管理用Makefile的比较多(Uboot里面也是大量使用Makefile来进行管理工程);在新型领域,比如物联网开发(特别是一些开源项目等),用Cmake的比较多(当然也有可能是例外哈!);好了,废话就不多说了,开始来学习了:

一、Cmake学习使用:

1、安装Cmake管理工具:

一般实际嵌入式linux开发,几乎都是用Ubuntu来开发的,因为那啥,安装啥应用程序的非常方便,只需一个命令“apt install + 应用程序名称” 大部分都直接搞定,不用再去配置(特殊的,就例外,还要一些其他相关配置!),安装Cmake就是一条命令直接搞定:

root@txp-virtual-machine:/home/txp# apt install cmake

Reading package lists... Done

Building dependency tree

2、先从一个简单示例,来得出一般书写步骤规律:

这里先写一个简单的代码工程main.c,然后再使用我们的cmake来管理代码工程:

#include <stdio.h>

int main(void)

printf("TXP嵌入式");

return 0;

然后开始写cmake工程管理文件,我在当前目录建立一个CMakeLists.txt文件,然后再往里面开始工程管理代码

root@txp-virtual-machine:/home/txp/test# pwd

/home/txp/test

root@txp-virtual-machine:/home/txp/test# touch CMakeLists.txt

root@txp-virtual-machine:/home/txp/test# ls

CMakeLists.txt main.c

CMakeLists.txt文件里面的内容如下:

cmake_minimum_required (VERSION 2.8)

project (main)

add_executable(main main.c)

解释一下这三条语句分别代表什么意思:

1、表示cmake最低执行版本是2.8才有效来管理我们的工程项目。

2、表示整个工程名为main

3、表示最终要生成的elf文件的名字叫main,使用的源文件是main.c

现在我们来实现cmake的功能,在当前目录下,使用命令"cmake ."(.表示当前目录,而..表示上一级目录),生成makefile等相关文件;然后再执行一下make命令进行编译工程,就能生成可执行文件main了,同时也会生成makefile文件,最后就可以执行可执行main文件,就能得到我们所要的结果:

root@txp-virtual-machine:/home/txp/test# cmake .

-- The C compiler identification is GNU 4.8.4

-- The CXX compiler identification is GNU 4.8.4

-- Check for working C compiler: /usr/bin/cc

-- Check for working C compiler: /usr/bin/cc -- works

-- Detecting C compiler ABI info

-- Detecting C compiler ABI info - done

-- Check for working CXX compiler: /usr/bin/c++

-- Check for working CXX compiler: /usr/bin/c++ -- works

-- Detecting CXX compiler ABI info

-- Detecting CXX compiler ABI info - done

-- Configuring done

-- Generating done

-- Build files have been written to: /home/txp/test

root@txp-virtual-machine:/home/txp/test# ls

CMakeCache.txt CMakeFiles cmake_install.cmake CMakeLists.txt main main.c Makefile

root@txp-virtual-machine:/home/txp/test# make

Scanning dependencies of target main

[100%] Building C object CMakeFiles/main.dir/main.c.o

Linking C executable main

[100%] Built target main

root@txp-virtual-machine:/home/txp/test# ./main

TXP嵌入式

如果你再好奇一下的话,可以打开看看Makefile里面的内容是啥,很容易想到是用makefile的方式来实现对工程main的管理,这里我就不画蛇添足把源代码贴出来了。cmake_install.cmake 是一些相关配置选项:

# Install script for directory: /home/txp/test

# Set the install prefix

IF(NOT DEFINED CMAKE_INSTALL_PREFIX)

SET(CMAKE_INSTALL_PREFIX "/usr/local")

ENDIF(NOT DEFINED CMAKE_INSTALL_PREFIX)

STRING(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")

# Set the install configuration name.

IF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)

IF(BUILD_TYPE)

STRING(REGEX REPLACE "^[^A-Za-z0-9_]+" ""

CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")

ELSE(BUILD_TYPE)

SET(CMAKE_INSTALL_CONFIG_NAME "")

ENDIF(BUILD_TYPE)

MESSAGE(STATUS "Install configuration: "${CMAKE_INSTALL_CONFIG_NAME}"")

ENDIF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)

# Set the component getting installed.

IF(NOT CMAKE_INSTALL_COMPONENT)

IF(COMPONENT)

MESSAGE(STATUS "Install component: "${COMPONENT}"")

SET(CMAKE_INSTALL_COMPONENT "${COMPONENT}")

ELSE(COMPONENT)

SET(CMAKE_INSTALL_COMPONENT)

ENDIF(COMPONENT)

ENDIF(NOT CMAKE_INSTALL_COMPONENT)

# Install shared libraries without execute permission?

IF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)

SET(CMAKE_INSTALL_SO_NO_EXE "1")

ENDIF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)

IF(CMAKE_INSTALL_COMPONENT)

SET(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt")

ELSE(CMAKE_INSTALL_COMPONENT)

SET(CMAKE_INSTALL_MANIFEST "install_manifest.txt")

ENDIF(CMAKE_INSTALL_COMPONENT)

FILE(WRITE "/home/txp/test/${CMAKE_INSTALL_MANIFEST}" "")

FOREACH(file ${CMAKE_INSTALL_MANIFEST_FILES})

FILE(APPEND "/home/txp/test/${CMAKE_INSTALL_MANIFEST}" "${file}")

ENDFOREACH(file)

而CMakeFiles是一个文件夹,里面文件内容如下:

root@txp-virtual-machine:/home/txp/test/CMakeFiles# ls

2.8.12.2 cmake.check_cache CMakeDirectoryInformation.cmake

CMakeOutput.log CMakeTmp main.dir Makefile2

Makefile.cmake progress.marks TargetDirectories.txt

审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • IC设计
    +关注

    关注

    38

    文章

    1369

    浏览量

    107901
  • Makefile
    +关注

    关注

    1

    文章

    125

    浏览量

    20200
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用vscode和cmake工具开发极海G32R501 MCU

    目前极海官方提供的 IDE 开发环境有 Keil/IAR/Eclipse。都能很好的完成开发,但是 VS Code 配合 CMake 工具是更加“现代”的C/C++开发环境,本文提供了在 VS Code 环境下的开发经验,以供参考。
    的头像 发表于 11-25 14:45 2630次阅读
    使用vscode和<b class='flag-5'>cmake</b>工具开发极海G32R501 MCU

    CubeMX 生成的 RTT 项目无法通过 cmake 编译怎么解决?

    在 CubeMX V6.13.0 版本上配置的 CMake 工程无法通过编译,报错如下图
    发表于 10-11 15:04

    第1章 如何学习单片机

      在错误的道路上日夜兼程,最终也无法成功,方法和思路绝对是最重要的。本章节讲到的学习单片机的方法,都是作者学习单片机的无数经验和教训总结出来的瑰宝。通过作者前面的披荆斩棘,开辟了道路,可以告诉读者
    的头像 发表于 10-10 10:32 233次阅读

    【CPKCOR-RA8D1】1、VSCODE+CMAKE开发环境搭建

    , BSP_DELAY_UNITS_MILLISECONDS); } 在CMakeLists.txt中增加句:set(CMAKE
    发表于 10-09 16:17

    常用PromQL查询案例总结

    在云原生时代,Prometheus已经成为监控领域的事实标准。作为名资深运维工程师,我见过太多团队在PromQL查询上踩坑,也见过太多因为监控不到位导致的生产事故。今天分享10个实战中最常用的PromQL查询案例,每个都是血泪经验的
    的头像 发表于 09-18 14:54 445次阅读

    ubuntu编译stm32cubmax生成的cmake工程,在最后链接阶段报错,怎么解决?

    我是直接stm32cubmax 生成的cmake 工程,我在Ubuntu 编译的时候找不到这个-lc_none , 但是我看了我的编译器安装路径有个nano.specs ,cmake 连接选项也有
    发表于 08-08 07:30

    SEGGER工具链集成到CMake和VS Code了

    SEGGER公司已将其嵌入式开发工具链集成到了广泛使用的CMake构建配置工具中,这意味着基于Visual Studio Code(VS Code)代码编辑器的应用开发可以方便的使用SEGGER工具实现了。
    的头像 发表于 07-23 15:06 774次阅读

    AI耳机变身翻译官+会议总结大师?涂鸦AI音频开发方案,让耳机升级到下个level

    在接入AI能力后,耳机这种日常化的产品,能有多大的想象空间?它不仅能帮你轻松听懂全球外语和地方方言,还能将语音转化为文字、翻译成不同语言,甚至自动总结会议要点、生成思维导图,适配办公、学习、跨语言
    的头像 发表于 07-10 18:47 1472次阅读
    AI耳机变身翻译官+会议<b class='flag-5'>总结</b>大师?涂鸦AI音频开发方案,让耳机升级到下<b class='flag-5'>一</b>个level

    相关协议信号总结

    电子发烧友网站提供《相关协议信号总结.xlsx》资料免费下载
    发表于 06-25 15:34 5次下载

    嵌入式AI技术之深度学习:数据样本预处理过程中使用合适的特征变换对深度学习的意义

      作者:苏勇Andrew 使用神经网络实现机器学习,网络的每个层都将对输入的数据做次抽象,多层神经网络构成深度学习的框架,可以深度理解数据中所要表示的规律。从原理上看,使用深度学习
    的头像 发表于 04-02 18:21 1281次阅读

    使用STM32CubeMX生成CMake工程中的FLASH.ld被更改怎么解决?

    使用STM32CubeMX生成CMake工程之后,对STM32xxxx_FLASH.ld进行了修改。然后再次使用STM32CubeMX对工程进行修改的时候,STM32xxxx_FLASH.ld文件汇总被修改的部分会被恢复原状。请问各位有没有好的办法能够解决这个问题,烦请指教!!!
    发表于 03-10 06:52

    在CubeMX V6.13.0版本上配置的CMake工程无法通过编译怎么解决?

    在 CubeMX V6.13.0 版本上配置的 CMake 工程无法通过编译,报错如下图
    发表于 03-07 16:59

    为什么无法在OpenVINO™ 2021.3源中使用CMAKE编译ONNX模型?

    尝试从源版本 2021.3 编译OpenVINO™ 错误: ~/项目/OpenVINO/cmake-build-debug/_deps/ext_onnx-src/onnx/onnx_pb.h
    发表于 03-05 08:29

    TOF学习总结

    iToF(间接飞行时间)技术中,波长越短,分辨细节的能力越好,主要原因与光的波动特性和调制信号的特性密切相关。以下是详细解释:1. 光的波动特性:波长与分辨率的关系波长越短,空间分辨率越高:光的波长决定了其能够分辨的最小细节。根据光学理论,分辨率与波长成反比,波长越短,能够分辨的特征尺寸越小。例如,可见光的波长(400-700 nm)比红外光(通常用于iToF,波长约850 nm)更短,因此可见光能够分辨更细微的细节。衍射极限:光的衍
    发表于 02-25 17:49 0次下载

    关于RISC-V芯片的应用学习总结

    RISC-V芯片作为种基于精简指令集计算(RISC)原则的开源指令集架构(ISA)芯片,近年来在多个领域展现出了广泛的应用潜力和显著优势。以下是对RISC-V芯片应用的总结。 RISC-V芯片
    发表于 01-29 08:38