首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使一个简单的makefile泛型

一个makefile是一个文本文件,用于指导编译器和链接器如何构建和生成一个软件项目。它包含了一系列规则和指令,用于描述源代码文件之间的依赖关系以及如何编译和链接这些文件。

泛型(Generic)是一种编程概念,指的是能够在不指定具体类型的情况下编写通用的代码。在makefile中,泛型可以用于实现灵活的构建规则,使得可以适应不同的项目和文件结构。

在makefile中实现泛型的方法有很多种,下面是一种常见的实现方式:

  1. 定义变量:可以使用变量来表示不同的文件名、目录名等,从而实现对不同项目的适应性。例如:
代码语言:txt
复制

SRC_DIR := src

OBJ_DIR := obj

BIN_DIR := bin

SRCS := $(wildcard $(SRC_DIR)/*.c)

OBJS := $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SRCS))

BIN := $(BIN_DIR)/app

$(BIN): $(OBJS)

gcc -o $@ $^

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c

gcc -c -o $@ $<

代码语言:txt
复制

在这个例子中,通过定义SRC_DIROBJ_DIRBIN_DIR等变量,可以灵活地适应不同的项目目录结构。同时,使用wildcardpatsubst函数可以自动获取源文件和目标文件列表。

  1. 使用模式规则:模式规则可以用于匹配不同类型的文件,并根据文件的类型执行不同的编译和链接规则。例如:
代码语言:txt
复制

%.o: %.c

gcc -c -o $@ $<

$(BIN): $(OBJS)

gcc -o $@ $^

代码语言:txt
复制

在这个例子中,%.o: %.c表示匹配所有以.c为后缀的文件,并执行gcc -c命令进行编译。通过这种方式,可以适应不同类型的源文件。

泛型的优势在于可以提高代码的复用性和可维护性,减少重复的工作量。它可以使makefile更加灵活和通用,适应不同的项目和需求。

泛型的应用场景包括但不限于:

  • 多个项目共享相同的编译规则和链接规则。
  • 同一个项目中有多个模块,每个模块都有相同的编译和链接规则。
  • 需要根据不同的编译选项生成不同的目标文件。

腾讯云提供了一系列与云计算相关的产品,包括云服务器、云数据库、云存储等。具体推荐的产品和产品介绍链接地址可以根据具体的需求和场景来确定。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

就这么简单

前言 从今天开始进入Java基础复习,可能一个星期会有一篇,我写博文未必都是正确~如果有写错地方请大家多多包涵并指正~ 今天要复习在Java中也是个很重要知识点...现在呢,我们可能就仅仅在某一个方法上需要使用….外界仅仅是关心该方法,不关心类其他属性…这样的话,我们在整个类上定义,未免就有些大题小作了。...前面我们已经定义了类,类是拥有这个特性类,它本质上还是一个Java类,那么它就可以被继承 那它是怎么被继承呢??...但编译器编译完带有java程序后,生成class文件中将不再带有形信息,以此使程序运行效率不受到影响,这个过程称之为“擦除”。...因为在抽象DAO中,是不可能知道哪一个DAO会继承它自己,所以是不知道其具体类型。而就是在创建时候才指定其具体类型。

53040
  • Makefile简单Makefile编写

    Makefile确定整个工程编译规则,只需要一个make命令,就可以实现“自动化编译”。...make是一个解释Makefile中指令命令工具,一般来说,大多数IDE都有这个命令,比如:Delphimake,Visual C++nmake,Linux下GNUmake。...(链接目标程序) 只要我们Makefile够好,我们只用一个make命令就可以完成,make命令会自动智能地根据当前文件修改情况来确定哪些文件需要重新编译,从而自己编译需要文件和链接生成可执行文件...---- Make变量 一个Makefile中我们发现经常会有重复内容,例如上面示例中: test01.o test02.o main.o 如果我们需要再加入一个.o文件,那么好几个地方都需要修改...所以,为了makefile易维护,在makefile中我们可以使用变量。makefile变量也就是一个字符串。可以理解为C语言中宏。

    98010

    【Java 简介 ( 类 | 方法 | 静态方法 | 类与方法完整示例 )

    文章目录 一、简介 二、类 三、方法 四、静态方法 五、类与方法完整示例 一、简介 ---- 可以 简单理解为 参数化类型 , 主要作用在 类 , 方法 , 接口 上...; 其中 参数 , 返回值 类型是 T , 但 这个 T 是作为一个正常类型使用 , 并不是声明在 方法 中 ; 如果 类 , 接口 , 方法 是 类 , 接口 , 方法 , 则该...: 方法中定义 T , 与 参数类型 T , 返回值类型 T , 方法内部 T , 都是同一个类型 ; /** * 类 * 该 T 类型作为参数使用 * T 是参数化类型...* 都是同一个类型 * * 与类中 T 完全没有关系 * * @param * @param * @...T * 都是同一个类型 * * 与类中 T 完全没有关系 * * @param * @param

    13.8K30

    【Flutter】Dart ( 类 | 方法 | 特定类型约束 )

    接口 , 方法 提供复用性 , 支持类型不确定数据类型 ; 类 : 提高代码复用程度 ; 方法 : 参数或返回值有类型约束 , 参数或返回值类型必须符合对应类型 , 使用时会进行类型检查约束...// 该类是一个缓存类 , 缓存数据类型是 T , 该类型可以是任意类型 class Cache{ /// 缓存数据存储到该 Map 集合中 Map... main.dart 中 State 就是类 ; class _MyHomePageState extends State { } State 类中要求一个 T ,.../ 类 : 提高代码复用程度 /// 该类是一个缓存类 , 缓存数据类型是 T , 该类型可以是任意类型 class Cache{ /// 缓存数据存储到该 Map 集合中 Map...} 是可选参数, 可选参数必须在构造函数参数列表中最后一个 /// /// 默认参数 : 可选参数中如果用户不初始化该可选参数 , 那么为其指定一个默认值 /// {this.city =

    5.1K00

    Java基础不简单很重要!

    前言 其实在开发中经常会看到使用,但是很多人对其也是一知半解,大概知道这是一个类似标签东西。比如最常见给集合定义。...什么是 Java是J2SE1.5中引入一个新特性,其本质是参数化类型,也就是说所操作数据类型被指定为一个参数(type parameter),这种参数类型可以用在类、接口和方法创建中,分别称为类...我们以最简单List集合为例子,假如没有: public static void main(String[] args) { List list = new ArrayList();...如果没有,第二个小问题是,我们把一个对象放进了集合中,但是集合并不会记住这个对象类型,再次取出时统统都会变成Object类,但是在运行时仍然为其本身类型。...Java 擦除是 Java 一个重要特性,其目的是避免过多创建类而造成运行时过度消耗。 使用方式 在上文也提到有三种使用方式:类、接口、方法。

    23410

    擦除是什么意思_类和方法区别

    大家好,又见面了,我是你们朋友全栈君 在严格代码里,带声明类总应该带着类型参数。但为了与老Java代码保持一致,也允许在使用带声明类时不指定实际类型。...如果没有为这个类指定实际类型,此时被称作raw type(原始类型),默认是声明该形参时指定一个上限类型。...当把一个具有信息对象赋给另一个没有信息变量时,所有在尖括号之间类型信息都将被扔掉。...比如一个 List 类型被转换为List,则该List对集合元素类型检查变成了参数上限(即Object)。...对而言,可以直接把一个List对象赋给一个 List 对象,编译器仅仅提示“未经检查转换”。

    1.3K30

    TypeScript:一个价值

    所谓 (Generics) 概念就是该行为一个例子,只是,这次我们不诉诸宏大,而是在代码层面的细枝末节中试图找出并描绘上述模式。 且听我细细道来…… 何为?...TypeScript 来拯救 正如我曾 尝试 说那样:一个就像若干类型一个变量,这意味着我们可以定义一个表示任何类型变量,同时能保持住类型信息。后者是关键,因为那正是 any 做不到。...这正是你期待一个强类型语言该做事情,并且这也是当定义 通用 行为时为何你要使用原因。 我还能用做些什么?...前面的例子常被称为 “Hello World”, 你能在任何一篇文章中找到它,但它是解释潜能一个绝佳途径。...下面是当你用一个非法属性名使用它时将会发生: ? 类(Generic classes) 不仅应用于函数签名,亦可用来定义你自己类。

    1.5K20

    类、方法、类型通配符使用

    方法一样,类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个参数,也被称为一个类型变量,是用于指定一个类型名称标识符。...       你可以写一个方法,该方法在调用时可以接收不同类型参数。...根据传递给方法参数类型,编译器适当地处理每一个方法调用。...下面是定义方法规则: 所有方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中)。...每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个参数,也被称为一个类型变量,是用于指定一个类型名称标识符。

    3.8K40

    typescript_有什么用

    大家好,又见面了,我是你们朋友全栈君。 指在定义函数、接口或类时候,不预先指定具体类型,而在使用时候再指定具体类型一种特性。...引入 下面创建一个函数, 实现功能: 根据指定数量 count 和数据 value , 创建一个包含 count 个 value 数组 不用的话,这个函数可能是下面这样: function createArray...createArray,传入2个参数value和count,返回any类型数组,然后定义了一个any类型空数组arr。...,因为规定了number类型,传入却是字符串11, 当我们输入如下代码,也会报错 报错原因如下 所以如果我们使用了,就会避免类型输入错误或者用错方法 多个参数函数...约束 如果我们直接对一个参数取 length 属性, 会报错, 因为这个根本就不知道它有这个属性 // 没有约束 function fn (x: T): void { console.log

    1.1K30

    Java

    # (generics) 他是 JDK5 中引入一个新特性,提供了编译时类型安全监测机制,该机制允许我们在编译时检测到非法类型数据结构。...本质就是参数化类型,也就是所操作数据类型被指定为一个参数 # 常见类型表示 上面的 T 仅仅类似一个形参作用,名字实际上是可以任意起,但是我们写代码总该是要讲究可读性。...为什么要使用? 说到为什么要使用,那肯定是找一大堆能说服自己优点啊。 # 引入,是java语言来讲是一个较大功能增强。...语法如下: public 类型参数 fun();如 public T fun(T t);这里 T 表示一个类型,而 表示我们定义了一个类型为 T 类型,这样...下面这么些才是一个标准带有返回值方法。

    65520

    引入

    二、 分类 方法 三、定义及简单演示 尖括号 是标志 T和E 是类型变量(Type Variable),变量名一般要大写 T和 E 在定义时是形参,代表意思是...MyPointNew 最终传入类型,但现在还不知道 使用不同大写字母指代不同类型 产生对象时,T和E类型可以相同也可以不同 四、背后作用时期和背后简单原理 是作用在编译期间一种机制...五、使用 // 定义了一个元素是 Book 引用 MyArrayList MyArrayList books = new MyArrayList(); books.add...book.get(0); // 不需要做类型转换 // 会产生编译错误,Book 类型无法转换为 Person 类型 Person person = book.get(0); 通过以上代码,我们可以看到一个使用方式...是一种编译期间机制,即 MyArrayList 和 MyArrayList 在运行期间是一个类型。 是 java 中一种合法语法,标志就是尖括号 。

    42740

    java(一)、基本介绍和使用

    http://blog.csdn.net/lonelyroamer/article/details/7864531    现在开始深入学习java了,以前一直只是在集合中简单使用,根本就不明白原理和作用...在学习之前,简单介绍下一些基本术语,以ArrayList和ArrayList做简要介绍: 整个成为ArrayList类型 ArrayList中 E...下面看看具体是如何定义。 1、定义和使用 一个类(generic class)就是具有一个或多个类型变量类。...2、接口定义和使用 定义接口和类差不多,看下面简单例子: [java] view plaincopy interface Show{   void show...= null)   return t;   else return null;       }   三、变量类型限定 在上面,我们简单学习了类、接口和方法。

    1.5K10

    一个故事读懂Java

    国王说道:“这是C++国王来使者,他带来了一个我们帝国没有的新玩意儿。 先生,你一路舟车劳顿,辛苦了,烦请你给我们说说C++王国吧。”...C++使者说: “在我们C++帝国,每次你去实例化一个/模板类都会生成一个类,例如模板类是List ,然后你用int ,double,string, Employee 分别去实例化, 那编译时候...“简单来说就是一个参数化类型经过擦除后会去除参数, 例如ArrayList 会被擦除为ArrayList” “那我传入String,Integer等都消失了?” 集合框架大臣大惊失色。...4 方法 集合框架大臣说: “陛下,刚才您说都是类, 对于一些静态方法该怎么办?” ? ? “简单啊,把那个移到方法上去!” 国王命令不容置疑 ? ?...国王特地设置了一个大臣职务, 暂时让集合框架大臣兼任, 没办法,集合框架改动是一个重头戏。 过了几天, 大臣兼集合框架大臣上了一个奏章,上面有一张图和若干代码: ? ?

    60040

    GenericFactoryMethod工厂模式实现简单IOC功能

    1、简介 工厂理论上不算Gof23中设计模式之一,但是也算是一种非常好设计模式,个人认为,废话不多说,先写个简单抽象工厂,在写一个工厂例子来比较抽象和区别. 2、实战 还是房屋和道路...ok,简单通过抽象工厂解决了现代化风格房屋创建,且BuildSystem并没有依赖具体现代化房屋和道路实现,他依赖是抽象,且如果这个时候需要其他风格房屋和道路创建,只需要通过扩展方式依次添加抽线和具体实现来完成需求....这里就不实现了,自行参考前面的随笔. 2、工厂 下面来通过工厂来实现上面的案例 public class Program { public static void...上面使用工厂配合C#其他一些特性完成了一个简单IOC容器功能.所以在设计一些模块时候也可以考虑将工厂作为创建型模式一种选择方案....当然你也可以进一步扩展,通过一个字典类,来完成配置文件方式,来动态完成对象注入,这里就不演示,自行实现.

    84720
    领券