Linux下使用Makefile实现条件编译

news2025/3/1 3:08:59

在Linux系统下Makefile和C/C++语言都有提供条件选择编译的语法,就是在编译源码的时候,可以选择性地编译指定的代码。这种条件选择编译的使用场合有好多,例如我们开发一个兼容标准版本与定制版本兼容的项目,那么,一些与需求密切相关的代码,就需要进行选择性编译;再比如我们开发一个兼容windows系统和Linux系统运行的项目,那么,一些与操作系统密切相关的代码,就需要进行选择性编译。在这篇文章就简单地讲一下基于Linux系统下通过Makefile实现条件选择编译的方法,下面将以两个功能模块module1,module2之间的条件选择编译为例子。

1.首先,在Linux目录下创建一个名为“proj”的目录。运行指令:mkdir -p proj

2.在该目录下依次创建如下文件:

module1.c内容如下所示:

#include<stdio.h>
#include<stdlib.h>

void module_1_func()
{
    printf("run module 1\n");
}

module2.c内容如下所示:

#include<stdio.h>
#include<stdlib.h>

void module_2_func()
{
    printf("run module 2\n");
}

main.c内容如下所示:

#include<stdio.h>
#include<stdlib.h>

void main()
{
    printf("start test demo!\n");
    printf("start module1 demo!\n");
    module_1_func();

    printf("start module2 demo!\n");
    module_2_func();
}

Makefile内容如下所示:

include ./config
CPROG    = test
BIN     = $(CPROG) 
CC= gcc
OBJS=main.o module1.o module2.o

all: $(BIN) 
clean:
    rm -f $(OBJS) $(BIN)
$(BIN): $(OBJS)
    $(CC)  -o $(BIN) $(OBJS)   $(CFLAGS) $(LDFLAGS) $(CFLAGS_EXTRA)

3.使用“make clean;make”编译之后生成一个名为“test”的可执行文件,运行这个可执行文件,结果如下图所示:

4.在当前目录下新增一个名为”config”的配置文件,在这个文件加入module1和module2的控制开关,内容如下所示(默认module1,module2功能模块关闭):

CONFIG_MODULE1=n
CONFIG_MODULE2=n

修改Makefile,内容如下:

#包含当前目录下的config文件
include ./config
CPROG    = test
BIN     = $(CPROG) 
CC= gcc
OBJS=main.o

#新增module1编译选项的条件判断
ifeq ($(CONFIG_MODULE1),y)
CFLAGS += -DHAVE_MODULE1
OBJS+=module1.o
endif
#新增module2编译选项的条件判断
ifeq ($(CONFIG_MODULE2),y)
CFLAGS += -DHAVE_MODULE2
OBJS+=module2.o
endif

all: $(BIN) 
clean:
    rm -f $(OBJS) $(BIN)
$(BIN): $(OBJS)
    $(CC)  -o $(BIN) $(OBJS)   $(CFLAGS) $(LDFLAGS) $(CFLAGS_EXTRA) 

修改main.c,内容如下所示:

#include<stdio.h>
#include<stdlib.h>

void main()
{
    printf("start test demo!\n");
#ifdef HAVE_MODULE1
    printf("start module1 demo!\n");
    module_1_func();
#endif

#ifdef HAVE_MODULE2
    printf("start module2 demo!\n");
    module_2_func();
#endif
}

5.修改config文件,并进行多次编译运行测试。

CONFIG_MODULE1=y

CONFIG_MODULE2=y

CONFIG_MODULE1=n

CONFIG_MODULE2=y

CONFIG_MODULE1=y

CONFIG_MODULE2=n

CONFIG_MODULE1=n

CONFIG_MODULE2=n

由以上一系列测试可知,通过修改”config”配置文件,可以很方便的根据不同的需求实现对代码进行条件编译。

总结:

条件编译使得我们可以按不同的条件编译不同的代码段,通过编译器命令行能够定义预处理器使用的宏,因而可以产生不同的目标代码,不仅可以根据需求对代码进行裁剪,缩小目标文件的体积,与此同时也可以将代码移植到不同的平台或不同的操作系统,提高软件开发效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/379085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[数据结构]:07-二叉树(无头结点)(C语言实现)

目录 前言 已完成内容 二叉树实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-QueueFunction.cpp 04-TreeFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代码。使用C引用主要是为了…

金三银四,助力你的大厂梦,2023年软件测试经典面试真题(3)(共3篇)

前言 金三银四即将到来&#xff0c;相信很多小伙伴要面临面试&#xff0c;一直想着说分享一些软件测试的面试题&#xff0c;这段时间做了一些收集和整理&#xff0c;下面共有三篇经典面试题&#xff0c;大家可以试着做一下&#xff0c;答案附在后面&#xff0c;希望能帮助到大…

【软件测试】从0到1的突破,appium自动化测试你真的会吗?自动化测试思路总结......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 总结一下APP UI自动…

超店有数分享:tiktok数据分析工具推荐,助你成功出海!

现阶段的跨境电商人都纷纷入局tiktok&#xff0c;这是风口也是发展趋势。Tiktok的下载量已经超过了35亿&#xff0c;每月都有10亿用户活跃&#xff0c;在154国家/地区使用。Tiktok用户每天在平均花1小时左右进行浏览&#xff0c;打开率也很高。如今&#xff0c;tiktok也越来越成…

酷雷曼VR丨十大“高含金量”荣誉,一起见证!

VR全景领域 十大“高含金量”荣誉 高光时刻 一同见证 01、双高新技术企业 同时获得国家高新技术企业、中关村高新技术企业双认证&#xff0c;是对酷雷曼企业研究开发组织管理水平、科技成果转化能力、自主知识产权数量、销售与总资产成长性等多维度实力的综合体现。 双高…

【MinIO】文件断点续传和分块合并

【MinIO】文件断点续传和分块合并 文章目录【MinIO】文件断点续传和分块合并0. 准备工作1. 检查文件是否存在1.1 定义接口1.2 编写实现方法2. 检查分块文件是否存在2.1 定义接口2.2 编写实现方法3. 上传分块文件接口3.1 定义接口3.2 编写实现方法4. 合并分块文件接口4.1 定义接…

如何判断一个客户是大客户?

米茂搜对主要外贸销售客户的识别方法整理如下&#xff1a;1. 确定研究目标。通过对客户数据的收集和分析&#xff0c;找出大客户&#xff0c;对大客户实施个性化管理&#xff0c;并对其服务进行跟踪&#xff0c;以及。不时地改善服务&#xff0c;以保持他们的忠诚度。2. 扩大信…

ChatGPT 引爆全网热议,如果当它是“聊天机器人”,那你可就错了

近日来&#xff0c;智能聊天机器人ChatGPT的出现引发众多网友讨论&#xff0c;那它到底是什么呢&#xff1f; 2022年11月&#xff0c;人工智能公司OpenAI推出了一款聊天机器人&#xff1a;ChatGPT。它能够通过学习和理解人类语言来进行对话&#xff0c;还能与聊天对象进行有逻…

骨传导耳机对骨头有影响吗?骨传导耳机好不好

首先很明确的告诉你&#xff0c;骨传导耳机对骨头是没有影响的&#xff0c;骨传导耳机反倒可以起到保护听力的作用。 骨传导是一种声音传导方式&#xff0c;即将声音转化为不同频率的机械振动&#xff0c;通过人的颅骨、骨迷路、内耳淋巴液传递&#xff0c;螺旋器、听神经、听觉…

【转载】bootstrap自定义样式-bootstrap侧边导航栏的实现

bootstrap自带的响应式导航栏是向下滑动的&#xff0c;但是有时满足不了个性化的需求: 侧滑栏使用定位fixed 使用bootstrap响应式使用工具类 visible-sm visible-xs hidden-xs hidden-sm等对不同屏幕适配 侧滑栏的侧滑效果不使用jquery方法来实现&#xff0c;使用的是css3 tr…

02-27 周一 图解机器学习SVM-人脸识别之PCA降维

02-27 周一 图解机器学习SVM分类时间版本修改人描述2023年2月27日09:48:38V0.1宋全恒新建文档 简介 本文主要是在试图代码分析图解机器学习这本书中5.5人脸识别分类&#xff08;p60&#xff09;&#xff0c;主要的过程是使用PCA技术和SVM技术进行人脸的分类工作。 准备 数据集…

JavaScript中单例模式这样用

如果希望自己的代码更优雅、可维护性更高以及更简洁&#xff0c;往往离不开设计模式这一解决方案。 在JS设计模式中&#xff0c;最核心的思想&#xff1a;封装变化&#xff08;将变与不变分离&#xff0c;确保变化的部分灵活&#xff0c;不变的部分稳定&#xff09;。 单例模式…

Spring Batch 综合案例实战中

目录 需求一 需求二 转视频版 需求一 需求&#xff1a;先动态生成50w条员工数据&#xff0c;存放再employee.csv文件中 步骤1&#xff1a;定义&#xff1a;DataInitController RestController public class DataInitController {Autowiredprivate IEmployeeService emplo…

arduino-sentry2之卡片篇

欧克,今天在学生的强烈要求下 我又重启arduino的sentry2调试篇 目前实验结果,可以检测到10张交通卡片 也就是如图所示十张 具体视频如下: https://live.csdn.net/v/279170 具体代码如下: #include <Arduino.h> #include <

什么是千年虫?计算机如何开始处理日期?都有哪些时间日期格式化?

目录 “千年虫”漏洞&#xff08;Year 2000 Problem&#xff0c;简称“Y2K”&#xff09; 计算机是怎么开始处理日期的么&#xff1f; 举例1&#xff1a;时间格式化举例( 过滤器) 举例2&#xff1a;时间格式化 自定义私有过滤器(日期格式化) 高性能计数器演示 OLE时间对象…

Vue的组件(注册、局部、组件复用、props、emit、生命周期)全解

文章目录前言知识点组件注册局部组件组件复用组件间通信props 类型检测子父组件通信之 emit动态组件生命周期函数前言 Vue 支持模块化和组件化开发&#xff0c;可以将整个页面进行模块化分割&#xff0c;低耦合高内聚&#xff0c;使得代码可以在各个地方使用。 知识点 组件注册…

python自学之《21天学通Python》(15)——第18章 数据结构基础

数据结构是用来描述一种或多种数据元素之间的特定关系&#xff0c;算法是程序设计中对数据操作的描述&#xff0c;数据结构和算法组成了程序。对于简单的任务&#xff0c;只要使用编程语言提供的基本数据类型就足够了。而对于较复杂的任务&#xff0c;就需要使用比基本的数据类…

华三OSPF 综合实验

OSPF 实验 实验拓扑 实验需求 按照图示配置 IP 地址按照图示分区域配置 OSPF &#xff0c;实现全网互通为了路由结构稳定&#xff0c;要求路由器使用环回口作为 Router-id&#xff0c;ABR 的环回口宣告进骨干区域 实验解法 1.配置 IP 地址部分 2.按照图示分区域配置 OS…

FFmpeg从入门到入魔(1):初探FFmpeg框架

1. FFmpeg介绍与裁剪1.1 FFmpeg简介FFmpeg&#xff08;Fast forword mpeg&#xff0c;音视频转换器&#xff09;是一个开源免费跨平台的视频和音频流方案&#xff0c;它提供了录制/音视频编解码、转换以及流化音视频的完整解决方案。ffmpeg4.0.2源码目录结构如下&#xff1a;目…

为什么IBDP的文凭更受美国大学的青睐?

家长们可以看到&#xff0c;不管是AP还是A-LEVEL这样的课程&#xff0c;都只是单科的课程&#xff08;A-LEVEL也是英国发展出来&#xff0c;AP是针对美国大学设计的&#xff09;&#xff0c;学生是可以针对他们的强项去做选修&#xff0c;比如我的化学很强&#xff0c;那我可以…