Makefile实例

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、编写程序

先编写三个程序,分别为hellomake.c、hellofunc.c、hellofunc.h

hellomake.c代码如下:

cpp 复制代码
//hellomake.c
#include<hellomake.h>
int main()
{
    // call a func in another file.
    myPrintHelloMake();
    return 0;
}

hellomake.h代码如下

cpp 复制代码
//hellofunc.c
#include<stdio.h>
#include<hellomake.h>

void myPrintHelloMake()
{
    printf("Hello, makefiles!\n");
    return;
}

hellomake.h

cpp 复制代码
//hellomake.h
void myPrintHelloMake();

将三个文件导入linux服务器进行编译。

进入文件目录,执行以下gcc命令

cpp 复制代码
gcc -o hellomake hellomake.c hellofunc.c -I.

这条指令编译两个c文件,并且生成可执行文件hellomake。-I.参数告诉工gcc从当前目录寻找头文件hellomake.h。

生成hellomake可执行文件,并执行

实现预期效果!

二、makefile编译

编写Makefile文件;Makefile version1

cpp 复制代码
hellomake: hellomake.c hellofun.c
    gcc -o hellomake hellomake,c hellofun.c -I.

一开始执行make的时候报错:

*** missing separator. Stop.

百度说没有使用tab键,第二行前面改成tab空格,就可以了。

实现预期效果。

三、优化makefile

Makefile version2

cpp 复制代码
CC=gcc
CFLAG=-I.
hellomake:hellomake.o hellofunc.o
    $(CC) -o hellomake hellomake.o hellofunc.o


#参考的教程坑货把CFLAGS写成了CFLAG,报错找不到头文件,太坑了我这种新手玩家了

注意,make命令不带参数的话,会默认执行makefile文件中的第一条规则。

此外,通过将命令依赖的文件列表放在:之后的第一行,make就知道如果其中的任何文件发生更改,就需要执行hellomake规则。

达到预期

ok!

Makefile version3

但是上个版本的makefile还忽略了一点:对头文件的依赖。如果你修改了hellomake.h文件,然后重新执行make,这时候即使需要重新编译c文件,make也不会重编的。为了解决这个问题,我们得告诉make,c文件依赖哪些h文件。

cpp 复制代码
CC=gcc
CFLAG=-I.
DEPS = hellomake.h

%.o:%.c $(DEPS)
    $(CC) -c -o $@ $<  $(CFLAGS)
hellomake: hellomake.o hellofunc.o
    $(CC) -o hellomake hellomake.o hellofunc.o

在这个版本中,我们新加了一个常量DEPS,这是c文件依赖的头文件集合。然后,我们又定义了一个适用于所有*.o文件的规则,这个规则说明.o文件依赖于同名的.c文件和DEPS中包含的头文件。为了产生.o文件,make需要使用CC常量定义的编译器编译.c文件。-c标志表示产生目标文件, -o $@表示将输出文件命名为:左边的文件名, $<表示依赖列表中的第一个项。

5. makefile version4

最后使用特殊的宏$@ $^做最后一次简化,让编译规则更加通用。$@ $^分别表示:左边和右边。在下面的例子中,所有的头文件都应该作为DEPS宏的一部分,所有的目标文件*.o都应该作为OBJ宏的一部分。

cpp 复制代码
CC=gcc
CFLAGS=-I.
DEPS = hellomake.h
OBJ = hellomake.o hellofunc.o

%.o:%.c $(DEPS)
    $(CC) -c -o $@ $<  $(CFLAGS)
hellomake: $(OBJ)
    $(CC) -o $@ $^ $(CFLAGS)

6. makefile version5

如果我们想把头文件,源文件和其他库文件分别放在不同的文件夹,那么makefile该怎么写呢?

另外,我们可以隐藏那些烦人的中间文件(目标文件)吗?当然可以!

下面的makefile定义了include文件夹,lib文件夹路径,并且把目标文件放到src文件夹的子文件夹obj里面。同时,还定义了一个宏,用于包含任何你想要包含的库,比如math库-lm。这个makefile文件应该位于src目录,注意,这个makefile 还包含了一个规则用于清理source和obj文件夹,只需要输入make clean即可。.PHONY规则可以让make不去改动任何名为clean的文件(如果有的话)。

cpp 复制代码
IDIR = ../include
CC=gcc
CFLAGS=-I$(IDIR)

ODIR=obj
LDIR=../lib

LIBS=-lm

_DEPS=hellomake.h
DEPS=$(pathsubst %,$(IDIR)/%,$(_DEPS))

_OBJ= hellomake.o hellofunc.o
OBJ = $(pathsubst %,$(ODIR)/%,$(_OBJ))

$(ODIR)/%.o:%.c $(DEPS)
    $(CC -c -o $@ $< $(CFLAGS
hellomake:$(OBJS)
    $(CC) -o $@ $^ $(CFLAGS) $(LIBS)
.PHONY:clean
clean:
    rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~

现在,我们有了一个非常不错的makefile,你可以对其进行简单的修改来管理中小型软件项目了。你也可以将多个规则写到一个makefile里面,甚至可以在一个规则中调用其他规则。

有关make和makefile的更多资料,敬请参考《GNU make手册》。


总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

相关推荐
带多刺的玫瑰39 分钟前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
陌小呆^O^1 小时前
Cmakelist.txt之win-c-udp-server
c语言·开发语言·udp
时光の尘2 小时前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
-一杯为品-2 小时前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
爱摸鱼的孔乙己3 小时前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn
Dola_Pan3 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
IU宝3 小时前
C/C++内存管理
java·c语言·c++
qq_459730033 小时前
C 语言面向对象
c语言·开发语言
陌小呆^O^4 小时前
Cmakelist.txt之win-c-udp-client
c语言·开发语言·udp
qystca7 小时前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法