前言

想复习下数据结构,所以看了看相关的课程后打算手写一些东西,比如链表或者说其他的常用数据结构。

环境

  • MacOSX
  • VSCode

本来打算在xcode上直接写纯C的程序的,但是写了几行就发现。。真鸡儿麻烦啊,而且我xcode用的也不好,各种快捷键也不熟就被劝退了。然后看到公司同事(server)很多都在用VSCode,可能是因为大家都在用mac笔记本的原因装visualstudio基本上就是扯淡,然后vscode也比较不错就采用了这个ide。

前置条件

  • 安装插件

    其实也就是这三个c/c+ c/c++ Clang CodeRunner

  • 编译环境配置

    1. vscode下:command+shift+p 调出控制中心 输入Tasks: Configure Task 来配置任务
    2. vscode调试界面选中齿轮设置按钮 选择c/c++(也就是一开始我们安装的那几个插件提供的)
      基本不需要改动就是program也就是运行程序里我改成了alex也就是我的这个程序名,这个随意。

以上就具备了在vscode下调试c/c++程序的功能了

编写代码

  • list.h 链表头文件 声明 结构体 以及几个 链表操作方法
  • list.c 链表普通操作方法的实现
  • main.c 入口文件 引入list.h

问题暴露

要想运行一个c的程序必须经过 编译+链接+运行 这三个阶段至于每个阶段都干了什么可以搜索其他相关文文章。这里我开始只是想简单的编译跑一下,那个时候我还没有使用makefile的方式,而是命令行(配置在task中)截图看下:
这样的方式,大家可以看到和我上面写的command有个很大的不同,上面的是make的方式也就是采用makefile,这里这个是直接命令行通过g++来进行编译文件,这个是我参考大佬们来学习的大佬文章地址 。很简单,就是你当前焦点的文件进行g++ 编译 -g选项是为了debug调试 -o是为了给生成的目标文件重命名。
在这样的前提下,我就跑的我的程序,在main.c下按键command+shift+B来编译程序
可以看到报错了,执行了task g++ xxxx -o xxx -g 下面为什么报错,因为insert也好display_list这些标记(方法)都不存在,为什么?这就是我一开始犯错的原因了。这个main.c 以来了list,但是我这里编译命令里并没有如何编译以来的内容,所以造成了这个报错现象。

解决方案MakeFile

发现了上面暴露的问题之后,我就开始搜索相关的内容和文章来看如何把以来文件也进行编译。找到了几篇相关的文章
linux+vsCode+makefile – 调试C
Makefile简易教程
我这里是根据第二篇文章进行学习的,第一篇文章给了我启发。

MakeFile

一个普通的makefile

calc: main.c getch.c getop.c stack.cgcc -o calc main.c getch.c getop.c stack.c

它主要分成了三个部分,第一行冒号之前的calc,我们称之为目标(target),被认为是这条语句所要处理的对象,具体到这里就是我们所要编译的这个程序calc。冒号后面的部分(main.c getch.c getop.c stack.c),我们称之为依赖关系表,也就是编译calc所需要的文件,这些文件只要有一个发生了变化,就会触发该语句的第三部分,我们称其为命令部分,相信你也看得出这就是一条编译命令。现在我们只要将上面这两行语句写入一个名为Makefile或者makefile的文件,然后在终端中输入make命令,就会看到它按照我们的设定去编译程序了。
但是这个问题很多
ex: 没能解决当我们只修改一个文件时就要全部重新编译的问题
ex: 如果我们需要往工程中添加一个.c或.h,可能同时就要再手动为obj常量再添加第一个.o文件,如果这列表很长,代码会非常难看

一个最终的makefile

cc = gcc
prom = alex
deps = $(shell find ./ -name "*.h")
src = $(shell find ./ -name "*.c")
obj = $(src:%.c=%.o) $(prom): $(obj)$(cc) -o $(prom) $(obj)%.o: %.c $(deps)$(cc) -g -c $< -o $@clean:rm -rf $(obj) $(prom)

这里解释一下makefile里的特殊符号

  • %.o:%.c,这是一个模式规则,表示所有的.o目标都依赖于与它同名的.c文件(当然还有deps中列出的头文件)
  • $<代表的是依赖关系表中的第一项(如果我们想引用的是整个关系表,那么就应该使用$^),具体到我们这里就是%.c。
  • $@代表的是当前语句的目标,即%.o。这样一来,make命令就会自动将所有的.c源文件编译成同名的.o文件。不用我们一项一项去指定了。
  • shell函数主要用于执行shell命令,具体到这里就是找出当前目录下所有的.c和.h文件。
  • $(src:%.c=%.o)则是一个字符替换函数,它会将src所有的.c字串替换成.o,实际上就等于列出了所有.c文件要编译的结果

终于跑起来

按照makefile的方式编辑好后,在main.c下按键command+shift+B来编译工程
可以看到根据我们编写的makefile逐步处理ex:我们编译alex这个程序需要mian.c list.c … 这里就会逐个编译list.c->list.o 一次类推,最后生成我们的目标文件-o alex 以来 xxx.o xx.o。
同样因为我们在命令里加了-g所以可以在vscode里进行调试(反之我们去掉-g就不能调试了)

一次心血来潮的C程序编译 makefile相关推荐

  1. 多线程编译与运行linux,Linux系统下多线程程序编译makefile文件

    在Linux下,编译一个多线程的程序命令为: gcc -lpthread -o file file.c 在Linux下,用交叉编译器编译一个在uclinux下运行的多线程程序,makefile文件如下 ...

  2. 程序编译时书写Makefile注意事项一例

    在进行程序编译时,可能需要指定一些库的库的路径.头文件的路径,分别使用的参数选项是-L和-I,需要注意的是: 需要确保-L和-I后边的内容不为空,否则会出现意想不到的错误,而这种错误比较难以发现,引起 ...

  3. 第一章 PX4程序编译过程解析

    版权声明:本文为博主原创文章,未经博主允许不得转载. 第一章 PX4程序编译过程解析 PX4是一款软硬件开源的项目,目的在于学习和研究.其中也有比较好的编程习惯,大家不妨可以学习一下国外牛人的编程习惯 ...

  4. linux qt手册,明远智睿I.MX6 Linux-4.1.15 QT5 程序编译手册

    明远智睿I.MX6 Linux-4.1.15 QT5 程序编译手册 [复制链接] 编译主机环境编译主机CPU架构:64位 编译主机系统:Linux Linux发行版:Ubuntu Ubuntu版本号: ...

  5. PX4程序编译过程解析

    第一章 PX4程序编译过程解析 PX4是一款软硬件开源的项目,目的在于学习和研究.其中也有比较好的编程习惯,大家不妨可以学习一下国外牛人的编程习惯.这个项目是苏黎世联邦理工大学的一个实验室搞出来的.该 ...

  6. 开源RISC-V处理器(蜂鸟E203)学习(五)A100T-FPGA 移植蜂鸟Hbirdv2,实现Centos下调试器USB识别以及程序编译烧写,并进行C语言仿真

    1.简述 最近购买了一块适合做原型验证FPGA板卡,板卡接口和外设比较丰富,十分适合跑一些小型的SOC工程,比如蜂鸟E203:板卡自带FPGA烧写器和软核CPU的JATG调试器,还有USB接口的UAR ...

  7. pcl的安装错误和高翔第5讲程序编译错误recipe for target 'all' failed

    今天编译程序的时候 遇到了这个错误: Makefile:149: recipe for target 'all' failed 之前其实安装pcl时也遇到过,但是以为是资源或者一些小原因,就只是照着网 ...

  8. DB2数据库的sqc程序编译过程

    这里的sqc程序是指在用到db2数据库的应用程序中,sql的嵌入式C编程.在用到Oracle数据库的应用程序中,sql的嵌入式c/c++编程则是pc程序,叫做Pro*c/c++编程. 1 DB2的嵌入 ...

  9. linux程序设计基础——概述,6.Linux程序设计基础—Makefile.pdf

    6.Linux程序设计基础-Makefile Haubo Training Center Linux开发基础-Makfile 张勇涛 GNU make 和makefile  GNU make概述  ...

最新文章

  1. 【干货】CNN与Transformer的强强联合!谷歌最新开源BoTNet,ImageNet达84.7%准确率
  2. BERT中的词向量指南
  3. 学生计算机基础知识,初中计算机基础知识练习题集锦(学生)
  4. Jenkins入门系列之——03PDF文档下载
  5. 图谱实战 | 安全领域知识图谱建设与典型应用场景总结
  6. 【AI视野·今日NLP 自然语言处理论文速览 第二十五期】Fri, 1 Oct 2021
  7. 函数返回字符串指针C语言,C语言:利用指针和函数调用编写字符串拷贝函数strcpy...
  8. webpack自定义打包命令
  9. group_concat 排序并取前三个
  10. python拆分字符串函数_Python字符串操作-拆分,切片,从HEX转换为DEC
  11. chrome 历史版本下载
  12. Oracle多条重复id,查询时间最早的那条
  13. 页面适配之pt、px、em、rem用法和特点
  14. openfire4.2.1 + smack4.2.2即时通信工具开发(android端登录、发送消息、接收消息)
  15. Istio 东西向流量管理
  16. Disable Win+R from launching Wox
  17. 微信小程序生成海报 poster
  18. 最小生成树合集(讲解与例题)
  19. Python取多维数组第n维的前几位
  20. chromeDriver下载地址

热门文章

  1. [转]volley-retrofit-okhttp之我们该如何选择网路框架
  2. objective-c中Category类别(扩展类)专题总结
  3. Js跨域请求jquery的jsonp方式
  4. 快速增量备份程序 DeltaCopy
  5. C#实现字符串左旋转操作
  6. Ubuntu安装Nginx+PHP+Memcache+Mysql指导手册
  7. WinApi学习笔记-获取电脑中磁盘信息
  8. 2009年新计划,开始使用dotnet来开发web
  9. 编程没基础学python多长时间-今天就来告诉你,没有编程基础的人适不适合学python...
  10. python图片识别-Python+Opencv识别两张相似图片