热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

C/C++从零开始的cmake教程

今天小编就为大家分享一篇关于CC++从零开始的cmake教程,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

C/C++从零开始的CMake教程

如果你有过在linux系统上源码安装某款软件的经历,那么肯定对这三部曲一点都不会陌生——配置(configure)、编译(make)、安装(make install)。几乎每次都是机器人般的操作,这背后其实是make(准确地说应该是GNU Make)在默默为你干了不少活。

1.编译hello.c——单一源文件的编译

//hello.c
#include 
int main(){
 puts("hello, world!");
 return 0;
}

为了编译生成对应的可执行文件,你可能会使用下面的命令:

$ cc -o hello hello.c
$ ./hello
hello, world!

但是,如果使用make(前提是你的操作系统已经安装了GCC和GNU Make),会显得更清爽一些。

$ make hello
cc hello.c -o hello
$ ./hello
hello, world!

1.1编写Makefile

什么?你连“make hello”都懒得写?看完这部分,你的“妄念”应该就能实现了,到时候你只需要慢悠悠地打出4个字母——”make”,然后按下回车键,比图形界面IDE还要方便(至少你不用到处去找那个该死的“运行”按钮在哪。

这时候你只要在hello.c的同一个目录下新建一个文件Makefile作为make命令的配置文件即可。它的内容很简单:

hello:

1.2设定编译器

什么?你不想使用默认的cc,而想使用gcc来编译程序?那还不简单,只用在Makefile文件中把CC变量的值赋为gcc就可以了。

CC := gcc
hello:

如果你这时候想运行make试下效果,请注意:make根本就不会重新编译生成hello。为什么啊?因为make很“懒”,因为它检测到hello.c和上一次编译时一模一样,再重新编译生成的可执行文件肯定也一样啊,那就没有运行的必要了,直接返回结果了。这时候可以用上些“小手段”,反正make很好骗。输入下面的命令,更新下hello.c的最近修改日期。

$ touch hello.c

或者干脆直接把hello文件删掉。但是删文件的方式也有高招和低招之分,如果你使用的是下面的命令:

$ rm -f hello

那么这就是低招了,因为这很可能误删了其他很重要的源文件,造成十分严重的后果。那么高招是什么呢?那就是在Makefile中添加下面的内容:

clean:
 $(RM) hello

运行方式也很简单,运行make clean命令即可。

1.3增加编译选项

如果你想为gcc增加-g -Wall -Wextra选项,那么只要设定变量CFLAGS的值即可。

CC := gcc
CFLAGS := -g -Wall -Wextra
hello:
clean:
 $(RM) hello

这时候,运行make clean和make的结果如下所示:

$ make clean
rm -f hello
$ make
gcc -g -Wall -Wextra hello.c -o hello

2.分块编译——编译有多个源文件的程序

如果程序不再只有一个源文件,那么结合Make的内置编译规则,也可以很简洁地编写Makefile文件完成编译任务。下面是一个简单的例子:

LDLIBS := -lncurses
block: block.o function.o
block.o function.o: function.h
clean:
 $(RM) *.o
 $(RM) block

其中程序需要用到ncurses,它是一个字符终端下屏幕控制的基本库,因此在编译时需要在最后增加-lncurses选项。这时候,可能你已经发现了,其实编写Makefile主要内容就是编写依赖关系,block: block.o function.o就是表示由block.o和function.o链接生成可执行文件block。同时bolck.o和function.o就是根据需要从bolck.c和function.c编译生成,因为make有如下内置规则:*.o由同名的c源文件生成,因此不必写多余的bolck.o:bolck.cfunction.o:function.c 。运行结果如下

$ make
cc -c -o block.o block.c
cc -c -o function.o function.c
cc block.o function.o -lncurses -o block

3.Make的内置规则

输入make -p命令,可以查看所有的make的内置规则,比如上面提到的*.o由同名的c源文件生成,在make -p的输出结果中显示如下:

%.o: %.c
# recipe to execute (内置):
 $(COMPILE.c) $(OUTPUT_OPTION) $<

其中,%为通配符,$(COMPILE.c)是取COMPILE.c这个变量的值,如果你好奇这个值到底是什么,可以再继续查找,发现下面的语句

# 默认
COMPILE.C = $(COMPILE.cc)

在进一步找,得到:

# 默认
COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c

上面的变量可以像之前的实例那样重新赋值(默认为空),从而自定义编译方式。

自动变量

除了像$(COMPILE.c)和$(COMPILE.cc)这样形式的变量,make中还存在一类很常用、无比重要的变量——自动变量。
下面列出最常用的自动变量:

  • $@ 规则的生成目标
  • $% 档案文件成员结构中的文件名元素
  • $<第一个依赖文件名
  • $^ 所有的依赖文件名(已经消重),以空格分隔
  • $+ 所有的依赖文件名(未经消重),以空格分隔
  • $* 所有除掉后缀的依赖文件名,以空格分隔,仅适用于模式规则。注:文件名包含stem和suffix,去掉suffix就剩下了stem。比如hello.cpp的stem是hello,suffix就是cpp。
  • $&#63; 比目标文件新的依赖文件。

比如下面这条规则:

 %: %.c
# commands to execute (built-in):
 $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@

LINK.c的定义如下:

LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)

CC的定义如下:

CC = cc

而且CFLAGS、CPPFLAGS、LDFLAGS、TARGET_ARCH默认都为空。
最后原来的规则等同于:

%: %.c
 cc $^ -o $@

所以本文开头的编译hello,只需简简单单的Makefile:

hello:

就可得到最终的编译命令:

cc hello.c -o hello

所以,参考make -p命令输出的make内置规则,编写自己程序的Makefile是个不错的编程习惯和学习如何熟练使用Make的途径。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接


推荐阅读
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • 【行业专题报告】 人力资源专题资料
    每项专题报告都是从2019开始更新到至今,后续将持续更新如需查看完整报告和报告下载或了解更多,公众号:参一江湖今天为大家分享专题 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 亿航184:全球首款全电力自动驾驶载人飞行器
    北京时间2016年1月7日,中国智能无人机公司亿航在拉斯维加斯CES展会上发布了其革命性的全电力低空自动驾驶载人飞行器——亿航184。这款飞行器不仅实现了人类的全自动驾驶飞行,还为中短途交通出行提供了创新解决方案。 ... [详细]
  • C语言标准及其GCC编译器版本
    编程语言的发展离不开持续的维护和更新。本文将探讨C语言的标准演变以及GCC编译器如何支持这些标准,确保其与时俱进,满足现代开发需求。 ... [详细]
  • 智能车间调度研究进展
    本文综述了基于强化学习的智能车间调度策略,探讨了车间调度问题在资源有限条件下的优化方法。通过数学规划、智能算法和强化学习等手段,解决了作业车间、流水车间和加工车间中的静态与动态调度挑战。重点讨论了不同场景下的求解方法及其应用前景。 ... [详细]
  • 智能投顾机器人:创业者如何应对新挑战?
    随着智能投顾技术在二级市场的兴起,针对一级市场的智能投顾也逐渐崭露头角。近日,一款名为阿尔妮塔的人工智能创投机器人正式发布,它将如何改变投资人的工作方式和创业者的融资策略? ... [详细]
  • 探讨了一个机器人从m x n网格的左上角出发,仅能向右或向下移动,最终到达右下角的所有可能路径数量的问题。 ... [详细]
  • 江苏启动鲲鹏生态产业园首批应用孵化项目
    2019年9月19日,在华为全联接大会上,江苏鲲鹏生态产业园正式启动了首批鲲鹏应用孵化项目。南京市委常委、江北新区党工委专职副书记罗群等多位嘉宾出席并见证了这一重要时刻。 ... [详细]
  • 随着机器人技术的不断进步,波士顿动力公司近期的创新成果再次吸引了公众的目光。特别是其Atlas机器人完成高难度后空翻动作,标志着机器人运动能力的重大突破。 ... [详细]
  • 小度科技完成B轮融资,估值突破330亿
    8月24日,百度宣布其智能生活事业群组业务——小度科技成功完成B轮融资,估值达到330亿元人民币。此次融资的具体投资方尚未公布。 ... [详细]
  • 古月居课程四足机器人控制与仿真入门笔记,视频链接:link四足机器人足端轨迹规划--摆线摆线定义模型表示matlab程序摆线定义摆线,又称 ... [详细]
  • 智慧城市建设现状及未来趋势
    随着新基建政策的推进及‘十四五’规划的实施,我国正步入以5G、人工智能等先进技术引领的智慧经济新时代。规划强调加速数字化转型,促进数字政府建设,新基建政策亦倡导城市基础设施的全面数字化。本文探讨了智慧城市的发展背景、全球及国内进展、市场规模、架构设计,以及百度、阿里、腾讯、华为等领军企业在该领域的布局策略。 ... [详细]
  • 首尔国立大学推出教育性乌龟机器人Shelly:引导儿童正确对待智能设备
    在最近的ACM/IEEE人机交互会议上,来自首尔国立大学的科学家们介绍了一款创新的乌龟机器人——Shelly。这款机器人设计独特,能够对环境中的触碰和打击作出响应,通过改变颜色和收回四肢来模拟恐惧反应,旨在教育孩子们理解并尊重机器人的感受。 ... [详细]
  • 概率图模型中的条件概率分布(CPD)详解
    条件概率分布(Conditional Probability Distribution, CPD)是概率图模型中的核心概念之一,用于描述随机变量在给定条件下遵循的概率分布。本文将深入探讨CPD的不同类型及其在实际问题中的应用。 ... [详细]
author-avatar
手机用户2502903031
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有