Linux学习笔记——例说makefile 头文件查找路径

2023-11-09

0.前言
    从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力。所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法。
    例说makefile分为以下几个部分,更多内容请参考【 例说makefile索引博文
    1.只有单个C文件   
    2.含有多个C文件    
    3.需要包括头文件路径
    4.增加宏定义
    5.增加系统共享库
    6.增加自定义共享库
    7.一个实际的例子
    【代码仓库】—— makefile-example
    代码仓库位于bitbucket,可借助TortoiseHg(GUI工具)克隆代码或者在网页中直接下载zip包。
1.三个C文件和三个头文件
    此处的例子稍微复杂些但更接近实际情况。
    文件结果如下:根目录中包含test.c makefileh和文件夹test-add和文件夹test-sub。
test.c makefile
    【test-add】test-add.c test-add.h
    【test-sub】test-sub.c test-sub.h
    【test.c】
#include <stdio.h>
#include <test-add.h>
#include <test-sub.h>
int main(void)
{
    int a = 3;
    int b = 2;
       
    printf("a=%d\n", a);
    printf("b=%d\n", b);
 
    printf("a+b=%d\n", add(a,b));
    printf("a-b=%d\n", sub(a,b));
    return 0;
}
    【test-add.c】
#include <test-add.h>
int add(int a, int b)
{
    return a+b;
}
    【test-add.h】
#ifndef __TEST_ADD
int add(int a, int b);
#endif
    【test-sub.c】
#include "test-sub.h"
int sub(int a, int b)
{
    return a-b;
}
    【test-sub.h】
#ifndef __TEST_SUB
int sub(int a, int b);
#endif
2.复习gcc指令
    gcc指令可通过-I前缀指定头文件路径,特别说明./代表当前路径,../代表上一级目录。
3.编写makefile
    请替换其中的[tab],并以代码仓库中的makefile文件为主。
# 指令编译器和选项
CC=gcc
CFLAGS=-Wall -std=gnu99

# 目标文件
TARGET=test
SRCS = test.c \
  ./test-add/test-add.c \
  ./test-sub/test-sub.c

INC = -I./test-add -I./test-sub

OBJS = $(SRCS:.c=.o)

$(TARGET):$(OBJS)
#	@echo TARGET:$@
#	@echo OBJECTS:$^
[tab]$(CC) -o $@ $^

clean:
[tab]rm -rf $(TARGET) $(OBJS)

%.o:%.c
[tab]$(CC) $(CFLAGS) $(INC) -o $@ -c $<
    【具体说明】
    【1】相比于单个文件和多个文件的makefile,通过变量INC制定了头文件路径。头文件路径之间通过空格隔开。
    【2】编译规则%.o:%.c中加入了头文件参数$(CC) $(CFLAGS)  $(INC) -o $@ -c $<,那么在编译的过程中便会出现
    gcc -Wall -std=gnu99  -I./test-add -I./test-sub -o test.o -c test.c。和单个文件和多个文件的makefile相比增加了头文件路径参数。
    【3】SRCS变量中,文件较多时可通过“\”符号续行。
     【编译】
    make clean && make
     【控制台输出】
rm -rf test test.o ./test-add/test-add.o ./test-sub/test-sub.o
gcc -Wall -std=gnu99  -I./test-add -I./test-sub -o test.o -c test.c
gcc -Wall -std=gnu99  -I./test-add -I./test-sub -o test-add/test-add.o -c test-add/test-add.c
gcc -Wall -std=gnu99  -I./test-add -I./test-sub -o test-sub/test-sub.o -c test-sub/test-sub.c
gcc -o test test.o test-add/test-add.o test-sub/test-sub.o
    从控制台的输出可以看出,通过make clean清除上一次的可执行文件和目标文件,然后依次编译各个C文件,在编译的过程中制定了 头文件路径,最后把3个目标文件链接为最终可执行文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux学习笔记——例说makefile 头文件查找路径 的相关文章

随机推荐

  • 1201活动总结 & 致谢

    时间就是这样 有时候会过的很快 有时候会过得很慢 一晃 一天的时间就已经过去 活动就已经结束了 这次活动是我有史以来组织的最大一次规模的活动 不管是从时间长度还是参加人数等等各方面 都突破了历史记录 这是第一次做全天的活动 五场演讲 可惜的
  • notepadqq_Notepadqq Linux文本编辑器入门

    notepadqq 我不使用Windows 我的意思是操作系统 至少 不是在我自己的计算机上 也没有我自己的任何工作 当我是一名顾问时 我经常不得不在客户办公室外工作 这意味着使用他们的硬件 这也意味着在许多这些办公室中使用Windows
  • STM32F030 HAL库内部 FLASH读写

    目录 前言 读flash 写flash 主循环 参考 https blog csdn net mrlixirong article details 124787282 https www 163 com dy article GPVKMC5
  • 玩转Mysql系列 - 第21篇:什么是索引?

    这是Mysql系列第21篇 本文开始连续3篇详解mysql索引 第1篇来说说什么是索引 第2篇详解Mysql中索引的原理 第3篇结合索引详解关键字explain 本文为索引第一篇 我们来了解一下什么是索引 路人在搞计算机之前 是负责小区建设
  • CentOS虚拟机之间设置SSH免密登录

    原文链接 CentOS虚拟机之间设置SSH免密登录 需求 现有三台虚拟机 设置三台虚拟机之间互相SSH登录时不需要密码 如有以下三台虚拟机 需要三台虚拟机之间通过ssh可以免密登录 192 168 1 201 192 168 1 202 1
  • 增加新Ctreeview 提示未定义解决办法!

    在StdAfx h中加入 include
  • 华为OD测试岗面经,一周走完面试流程

    一周走完面试流程 10 18 机考 机试210 第一题 最大N个数与最小N个数的和 第二题 拼接URL 第三题 跳格子 性格测试 题目比较多 有一百多道 在三个选项中选出一个最符合的和一个最不符合的 答题的时候以积极乐观的心态去选择 尽量保
  • Photoscan/Metashape与Contextcapture联合建模

    Photoscan与Contextcapture联合建模以及激光与影像联合建模 使用Photoscan完成影像的地理坐标与投影坐标转换 Photoscan空三结果导出 Contextcapture导入空三区块 CC刺控制点并继续AT 倾斜摄
  • Mac 终端关闭tomcat报错 org.apache.catalina.startup.Catalina stopServer 严重: Error stopping Catalina

    Mac 终端关闭tomcat sh shutdown sh 报错 org apache catalina startup Catalina stopServer 严重 Error stopping Catalina 原因mac权限问题 到T
  • AdapterView及子类的相关学习整理

    一 了解 AdapterView 及其子类 这个图片是网上找的 主要是了解一下结构 其中AbsListView AbsSpinner AdapterViewAnimation依然是抽象类 实际使用时需要使用它们的子类 后面我会逐个练习这些子
  • python总结(九):python面向对象高级编程

    一 给实例绑定属性 方法 给类绑定方法 coding utf 8 class Student object pass 给实例绑定属性 s Student s name Jason Zhang s score 90 print s name
  • Mybatis中的一般查询

    1 经常要使用到根据文本框输入的内容来进行模糊查询 这个时候涉及到几个问题 xml文件怎么样写模糊查询语句 即怎么样拼接参数的问题 此外还需要判断某个传递的参数是否为空的问题 控制器中怎么样传递这个参数这样在xml文件中的if标签才可以使用
  • VUE element-ui之el-tree树形控件获取最后一级节点(无子节点的节点)

    步骤 模板中定义ref
  • Qt 富文本处理(11):表格和表格格式

    文章目录 前言 QTextTable类 QTextTableFormat类 QTextTableCell 类 QTextTableCellFormat 类 代码示例 总结 前言 富文本文档的表格相关类 QTextTable类 QTextTa
  • linux下通过.sh文件启动java程序

    http blog csdn net cnmcxiari article details 6673081 linux下通过 sh文件启动java程序 首先把java程序打成jar包 指定好主类 入口 sh文件如下 bin sh java X
  • 区块链会给医药行业带来哪些改变?

    我不是药神 上映以来好评如潮 票房大涨 是一部叫好又叫座的佳作 不仅豆瓣评分9 0 更被人民日报誉为近年来难得一见的经典电影 该片真实再现了白血病群体的生存现状 让观众对白血病患者有了深刻的认知 也将一个残酷的现实摆在面前 一场大病足以让一
  • 编译Hi3516DV300的SDK

    前言 如果您之前编译过EV200的SDK 那么您会发现 编译DV300的过程很类似 软件包直接拷贝 无需重新下载 通常在1 2个小时内能搞定SDK的编译 DV300的入门会简洁介绍 如果遇到编译错误 请你阅读EV200的编译过程和相应目录下
  • ACL 2023 :大模型的安全与可靠性、复杂逻辑查询、情感分析等

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 哔哩哔哩直播通道 扫码关注AI TIME哔哩哔哩官方账号预约直播 13 30 13 50 Yu Zhou NonSequential Graph Script Induction
  • jmap命令详解

    JVM常见命令之jmap jmap命令详解 jmap是一个很重要的命令 可以查看JVM内存使用情况 jmap帮助文档 参数解释 option 选项参数 pid 需要打印配置信息的进程ID executable 产生核心dump的Java可执
  • Linux学习笔记——例说makefile 头文件查找路径

    0 前言 从学习C语言开始就慢慢开始接触makefile 查阅了很多的makefile的资料但总感觉没有真正掌握makefile 如果自己动手写一个makefile总觉得非常吃力 所以特意借助博客总结makefile的相关知识 通过例子说明