gcc编译器与Makefile入门

2023-05-16

在Windows下开发通常使用各种IDE,但在Linux下进行C编程编译代码的话需要用到GCC编译器。

一、编译流程

GCC 编译器的编译流程是:预处理、编译、汇编和链接。预处理就是展开所有的头文件、替换程序中的宏、解析条件编译并添加到文件中。编译是将经过预编译处理的代码编译成汇编代码,也就是我们常说的程序编译。汇编就是将汇编语言文件编译成二进制目标文件。链接就是将汇编出来的多个二进制目标文件链接在一起,形成最终的可执行文件。
新建一个文件用gcc编译:
新建一个c_practice文件夹,在此文件夹下用vim编辑器新建一个main.c文件
在这里插入图片描述
提示没有vim编辑器,安装一下,再使用vim main.c命令编辑代码:
发现vim编辑器没有行号,设置一下,打开/etc/vim/vimrc文件,在文件最下面一行加上:set nu(记得使用管理员权限sudo vim vimrc,不然有可能没有写的权限),以及tab键首行缩进有8空格,同样用set ts=4修改一下
在这里插入图片描述
写一个helloworld
在这里插入图片描述
编译main.c文件使用命令如下

gcc main.c

编译器提示错误
在这里插入图片描述
修改后再编译可以看到文件夹中多出了a.out文件,这是刚刚编译生成的可执行文件,这是编译器自动命名的,使用./a.out运行下看看
在这里插入图片描述
想要指定可执行文件的名字的话,使用-o参数,如

gcc main.c -o main

在这里插入图片描述

二、多文件编译

main.c代码如下

 1 #include <stdio.h>
  2 #include "input.h"
  3 #include "calcu.h"
  4 
  5 void main()
  6 {   
  7     int a, b, num;
  8     
  9     input_int(&a, &b);
 10     num = calcu(a, b);
 11     printf("%d + %d = %d\r\n", a, b, num);
 12 

input.c文件代码:

 1 #include <stdio.h>
  2 #include "input.h"
  3 
  4 void input_int(int *a, int *b)
  5 {
  6     printf("input two num:");
  7     scanf("%d %d", a, b);
  8     printf("\r\n");
  9 }

calcu.c文件

  1 #include "stdio.h"
  2 
  3 int calcu(int a, int b)
  4 {
  5     return (a + b);
  6 }

input.h文件

  1 #ifndef _INPUT_H
  2 #define _INPUT_H
  3 
  4 void input_int(int *a, int *b);
  5       
  6 #endif

calcu.h文件

  1 #ifndef _CALCU_H
  2 #define _CALCU_H
  3 
  4 int calcu(int a, int b);
  5         
  6 #endif

使用命令,输出如下

gcc main.c calcu.c input.c -o main

在这里插入图片描述

三、makefile

如果文件有成百上千个,编译起来时间就很长,书写也费劲,,为此提出了一个解决大工程编译的工具:make,描述哪些文件需要编译、哪些需要重新编译的文件就叫做 Makefile,Makefile 就跟脚本文件一样,Makefile 里面还可以执行系统命令。使用的时候只需要一个 make命令即可完成整个工程的自动编译。
在工程目录下创建名为“Makefile”的文件,文件名一定要叫做“Makefile”!!!区分大小写

  1 main: main.o input.o calcu.o
  2     gcc -o main main.o input.o calcu.o
  3 main.o: main.c
  4     gcc -c main.c
  5 input.o: input.c
  6     gcc -c input.c
  7 calcu.o: calcu.c
  8     gcc -c calcu.c
  9     
 10 clean:
 11     rm *.o
 12     rm main

上述代码中所有行首需要空出来的地方一定要使用“TAB”键!不要使用空格键!这是Makefile 的语法要求,编写好得 Makefile 如图所示:
在这里插入图片描述
这里使用gcc -c …命令将相应的.c文件编译成.o文件,然后用gcc -o main …命令将每个.o文件链接起来生成main可执行文件
接下来直接在命令行中输入“make”即可,make 命令会在当前目录下查找是否存在“Makefile”这个文件,如果存在的话就会按照 Makefile 里面定义的编译方式进行编译
在这里插入图片描述
执行make之后可以看到生成了对应的.o文件和main可执行文件,说明编译成功

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

gcc编译器与Makefile入门 的相关文章

  • TRACE32——内存填充测试Data.Pattern

    TRACE32 内存填充测试Data Pattern Data Pattern 命令可以用于对内存 xff08 SRAM DDR Flash等 xff09 写入随机值 xff0c 以快速地测试内存是否可以正确读写 命令格式 xff1a 示
  • STM32使用printf重定向

    最近用STM32CubeMX创建了一个demo工程 xff0c 在调试过程中 xff0c printf打印功能一直不能正常打印 xff0c 检查工程中也已将fputc函数进行了实现 奇怪的是用JTAG进行调试时打印恢复了正常 最后发现问题的
  • repo的安装和使用

    前言 Android 采用 Gerrit 提供代码评审服务 xff0c 并且开发了一个客户端工具 repo xff0c 实现多仓库管理 Git 的开发者对服务端的 Git 源码做了扩展 xff0c 使得基于 Git xff08 cgit x
  • repo sync之后不能自动 rebase 的定位

    背景 最近在使用repo sync同步代码时老是报告 xff1a branch xxx is published but not merged and is now 1 commits behind 我之前是由推送过一笔提交 xff0c 但
  • git取指定日期log问题

    库上版本有一个重要bug xff0c 使用了如下命令取一个版本 xff1a repo forall c 39 commitID 61 96 git log before 34 2022 12 09 00 00 00 34 1 pretty
  • ROS读取激光雷达点云数据(RS-Lidar为例)

    一 准备工作 xff1a 1 安装ROS xff08 含有rviz xff09 xff1b 2 安装pcl ros pcl xff08 Point Cloud Library xff09 ros 是ROS中点云和3D几何处理的接口和工具 如
  • 标准预定义的宏

    标准预定义宏是由相关的语言标准规定的 xff0c 所以它们可以在所有执行这些标准的编译器中使用 旧的编译器可能不会提供所有这些宏 它们的名字都以双下划线开头 FILE 这个宏扩展为当前输入文件的名称 xff0c 以 C 字符串常数的形式 这
  • Realsense L515使用

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 主要参考二 基本情况 xff08 一 xff09 ubuntu和ROS情况 xff08 二 xff09 主要步骤 总结
  • 电脑前置摄像头运行ORB-SLAM2 Mono

    ROS本地摄像头 下载安装usb cam包 最好将它放在ROS空间的src文件夹下 xff0c 方便管理 git clone https github com bosch ros pkg usb cam git usb cam cd usb
  • ERROR:cannot launch node of type

    当使用roslaunch启动ros节点时 xff0c 如果出现 ERROR cannot launch node of type 这个错误 xff0c 一般原因是由于没有source bashrc 因此工作空间使用 source bashr
  • Ubuntu 18.04 运行PL-VINS

    代码地址 https span class token operator span span class token comment github com cnqiangfu PL VINS span 安装过程出错参考 PL VINS配置
  • rosbag.bag.ROSBagUnindexedException: Unindexed bag

    rosbag bag ROSBagUnindexedException Unindexed bag ROSBAG
  • d435i 相机和IMU联合标定

    一 前提 我们已经对RGB摄像头和IMU进行了单独标定 参考之前博文 RGB标定 IMU kalibr官方WIKI Kalibr 二 准备标定文件 2 1 标定板yaml文件 标定下载链接 Aprilgrid 6x6 0 5x0 5 m u
  • opencv版权nofree问题

    找到3 1 0中cpp文件拷贝到3 4 12中 xff0c 重新cmake编译 xff0c 即可使用 nofree解决方案
  • realsense d435i 自制Euroc数据集

    参考 提取bag Python程序地址 span class token operator span home span class token operator span yang span class token operator sp
  • orb-slam2运行自己数据集

    因为我跑的是双目摄像头 所以首先在orb slam2下找到ros stereo cc文件然后对其中的rostopic节点进行修改 首先先找到自己对应的节点在 自己录制的 bag 数据集下打开终端执行 rosbag info xxx bag在
  • 【Linux】CMake编译C/C++工程文件

    Linux CMake编译C C 43 43 工程文件 文章目录 Linux CMake编译C C 43 43 工程文件前言一 CMake编译工程1 1 两种方式设置编译规则1 2 两种构建方式1 3 CMake构建C C 43 43 工程
  • STM32学习笔记 GPIO初始化参数结构体介绍

    GPIO初始化参数结构体如下 xff1a typedef struct uint16 t GPIO Pin GPIOSpeed TypeDef GPIO Speed GPIOMode Typedef GPIO Mode GPIO InitT
  • Failed to load resource: the server responded with a status of 401 (UNAUTHORIZED) 解决token失效 401错误码

    在这里我们要对别人的错误状态进行判断 来使用刷星token 解决token失效的 401的问题 让别人在后台看不见的地方 登陆失败 然后里面调用这里的请求 再获取最新的token值 然后重新设置到我们的本地存储里面去 span class
  • 企业微信 => 企业微信接入第三方应用(vue的H5) 第一阶段:授权登录 前端部分

    企业微信接入第三方应用 企业微信接入第三方应用 xff08 以服务商身份 xff09 一 确认我们是第三方应用开发还是企业内部开发选项 xff08 对后面有很大区别 xff09 二 需要的准备 xff1a 注册两个企业 xff0c 一个作为

随机推荐

  • 【小程序系列】使用uView 自定义配置uni-app原生中的tabBar

    一 uView是什么 xff1f uView是uni app生态专用的UI框架 xff0c 是一个开源 免费的优秀框架 二 安装与配置 官方文档讲的很详细 xff0c 所以这里就直接引用 xff1a 安装与配置 三 使用步骤 在完成第二步
  • 【Vue3系列】 父组件调用子组件的方法-子组件向父组件传值

    一 xff1a 父组件调用子组件的方法 父组件 span class token operator lt span template span class token operator gt span span class token op
  • 【vue】笔记本默认设置125%或者150%缩放,导致布局错乱的解决方法

    目录 一 xff1a 为什么会出现有这个问题 xff1f 二 xff1a 有什么解决方案 xff1f 三 xff1a vue项目utils下新建js四 xff1a 全局导入App vue五 xff1a 重新进入项目六 xff1a 注意事项
  • 【Cocos creator】Cocos creator介绍和入门

    目录 一 工作流程二 安装和启动三 入门示例四 项目结构五 编辑器界面 Cocos Creator 是一个完整的游戏开发解决方案 xff0c 包含了 cocos2d x 引擎的 JavaScript 实现 xff0c 以及快速开发游戏所需求
  • 【Vue面试专题】50+道经典Vue面试题详解!

    目录 前言相关学习资源01 Vue组件之间通信方式有哪些02 v if和v for哪个优先级更高 xff1f 03 能说一说双向绑定使用和原理吗 xff1f 04 Vue中如何扩展一个组件05 子组件可以直接改变父组件的数据么 xff0c
  • 【Uni-App】点击分享,生成海报带二维码,保存到本地图片,写入文字

    目录 一 xff1a 需求二 xff1a 分析三 xff1a 准备工作1 qrcode准备2 并且在main js去挂载 四 xff1a 页面构建1 html2 data3 js 二维码嵌入文字 一 xff1a 需求 1 产品需要这个商品
  • 【Uni-App】uniapp使用uview实现弹出键盘输入密码/验证码功能

    目录 xff08 一 xff09 效果图 xff08 二 xff09 使用组件说明keyboard属性 xff1a keyboard事件 xff1a xff08 五 xff09 js代码实现 xff08 一 xff09 效果图 xff08
  • printf 缓冲区原理 (你想知道的C语言 1.4)

    Q 缓冲区究竟是什么概念 A 缓冲 顾名思义 表示可以酌情商量有回旋余地 可以想象一种只能强制遵守且说一不二的情形 xff0c 一种可以协商开发此消彼长的模式 区 理解成可以协助存储 处理的物理位置 xff0c 一般理解成内存 计算机科学的
  • 【面试题】京东面试查漏补缺

    目录 一 xff1a 笔试题1 如何获取URL中的参数方法一方法二 2 怎么平铺多维数组方法一方法二 xff1a 递归方法三 xff1a flat 和 flatMap 二 xff1a 面试题1 promise相关问题2 vue nextTi
  • 【Vue3】element-plus中el-tree的递归处理赋值回显问题

    目录 一 xff1a 先获取所有权限tree二 xff1a 在获取所有该角色能有的权限tree三 xff1a 递归处理勾选tree节点 由于项目是从0 1开始构建的 rbac都需要重新构建对接 所以涉及到了权限管理和菜单管理 一级菜单包含多
  • 【ChatGPT】体验一下ChatGPT

    体验一下ChatGPT 可以帮你写代码 写邮件 编故事的神器 最近OpenAI 发布了备受期待的原型通用 ChatGPT xff0c 这是一种基于对话的 AI 聊天界面 xff0c 算是GPT 3 Generative Pre traine
  • vant进度条框架报错,百家云移动端h5点播SDK, 二维码分享

    vant进度条框架报错 错误信息 xff1a Invalid prop type check failed for prop percentage Expected Number 网上查找问题原因 xff1a 1 xff0c 因为vant进
  • 51单片机上数码管的静态显示和动态显示

    一 TX1C数码管介绍 共阴极和共阳极数码管 xff0c 实验板上是共阴极数码管 xff0c 6位一体的数码管 连接原理图如下面两图 xff1a 连在一起的段线 xff08 段选线即abcdefgh xff09 控制数码管亮什么数字 xff
  • 51单片机的键盘检测原理

    一 独立键盘检测 1 按键的检测原理 单片机的I O口既可以作为输出也可以作为输入使用 xff0c 检测按键时用的是输入功能 把按键的一端接地 xff0c 另一端与单片机的某个I O口相连 xff0c 开始时先给该I O口赋一个高电平 xf
  • 51单片机上AD和DA操作

    一 ADC0804的操作 1 试验板上ADC0804的接线图 AD芯片上的第5管脚INTR没有接线 xff0c 因为该实验板读取A D数据没有用中断法 xff0c 所以可以不接该引脚 2 芯片的操作时序图如下 操作芯片时基本按照此顺序操作各
  • ESP32上对flash的读取操作

    通过按键控制一个LED灯的亮和灭 xff0c 每次重启时读上一次的状态 span class token macro property span class token directive hash span span class toke
  • 正点原子stm32F407学习笔记6——外部中断实验

    一 GPIO与中断线的映射关系 GPIO 的管脚GPIOx 0 GPIOx 15 x 61 A B C D E xff0c F G H I 分别对应中断线 0 15 这样每个中断线对应了最多 9 个 IO 口 xff0c 以线 0 为例 x
  • 通俗易懂的socket select模型讲解

    通俗易懂的socket select模型讲解 FFFF ireCore 前面一篇介绍了服务器端使用多线程的方式来处理多个客户端的请求的 xff0c 但是当客户端数量增多时线程数量会急剧增加 xff0c 导致消耗大量的资源 于是就引出了服务器
  • 【esp32学习之路7——硬件定时器】

    一 概述 ESP32 的定时器分为 2 组 xff0c 每组 2 个 ESP32 内置 4 个 64 bit 通用定时器 每个定时器包含一个 16 bit 预分频器和一个64 bit 可自动重新加载向上 xff0f 向下计数器 详情可参考乐
  • gcc编译器与Makefile入门

    在Windows下开发通常使用各种IDE xff0c 但在Linux下进行C编程编译代码的话需要用到GCC编译器 一 编译流程 GCC 编译器的编译流程是 xff1a 预处理 编译 汇编和链接 预处理就是展开所有的头文件 替换程序中的宏 解