大家晚上好,在这里祝大家端午安康。今天给大家分享的是工程管理工具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
红外线漫反射光电开关是什么功能
UWB室内定位技术具哪些特点
AOI技术的工作逻辑及结构介绍
半导体制造关键流程中的常见技术难题有哪些
ADI 公司成立大中华区客户服务中心
cmake学习的总结(一)
探索你不知道的华为5G实力
国内什么品牌的运动耳机好,运动蓝牙耳机推荐
美国半推出业内相位调光效果最佳的LM3450 LED 驱动器
采用圆图理解阻抗匹配
导航手势风行一时,而三星Galaxy S20确实拥有它们
物联网展区的成员展示
层出不穷的信号发生器可有效节省测试时间
中国电信完成了自研MEC系统与5GC网络商用版本的对接验证
中国互联网市场将迎来新机遇和挑战
Du/Dt电抗器与正弦波滤波器的异同点分析
Super Sabre电源连接器系统:适合需灵活线对线与线对板配置的高电流应用
智造之眼丨深度学习应用
英特尔推出首款低温控制芯片,实现对多个量子位的控制提高计算能力
昕诺飞工业投资1300万欧元 IRIS项目落户仪征