掌握Linux编程技巧,轻松编写Makefile (linux 编写makefile)

随着现代技术的飞速发展,Linux系统在计算机领域得到了广泛的应用。Linux系统拥有开源、安全、稳定的特点,深受开发者们的喜爱。在Linux系统中,Makefile是一种非常重要的工具,能够自动化地构建项目,帮助开发者更加高效地进行代码管理和编译。本文将教授Linux编程技巧,帮助读者轻松编写Makefile,提高开发效率。

什么是Makefile

在Linux系统中,Makefile是一个非常常用的工具,它可以通过自动化检测源文件的变化和依赖关系,构建出最终的可执行文件或者库文件。Makefile的工作流程如下:

1. Makefile需要定义一些变量和宏定义,用于指定编译器、编译选项、源文件和目标文件等。

2. 接下来,Makefile会检测源文件的修改时间和依赖关系,只有在必要的情况下才重新编译源文件。

3. 如果源文件被修改或者依赖关系被修改,Makefile会自动重新编译源文件,并生成相应的目标文件。

4. Makefile会把目标文件链接成最终的可执行文件或者库文件。

通过使用Makefile,开发者可以在工作期间省去手动编译的繁琐过程,以及避免犯错的风险,提高了代码的可读性和可维护性。

编写Makefile的技巧

为了能够正确地编写Makefile,开发者需要掌握一些Linux编程的基本技巧,下面我们将一一介绍。

1. 变量的使用

Makefile中使用变量和宏定义可以简化程序的编写,并减少冗余代码。例如,我们可以定义CC、CFLAGS、SRC和OBJ等变量:

CC = gcc

CFLAGS = -g -Wall -O2

SRC = mn.c test.c

OBJ = mn.o test.o

其中,CC指定了使用的编译器,默认为gcc;CFLAGS定义了编译选项的参数,包括调试信息、警告信息和优化等;SRC列出了所有源文件的名字;OBJ列出了所有目标文件的名字。在实际使用中,只需修改这些变量的值即可满足不同的需求。

2. 目标、依赖和命令的定义

为了保证Makefile的正确性,需要明确规定每个目标所依赖的文件以及相应的命令。例如,我们可以定义如下的一个Makefile:

all: $(OBJ)

$(CC) $(CFLAGS) -o mn $(OBJ)

%.o: %.c

$(CC) $(CFLAGS) -c $

clean:

rm -f $(OBJ) mn

其中,all为默认目标,表示编译所有的文件;$(OBJ)表示编译所有目标文件;$(CC)表示编译器的名字,$@表示目标文件的名字,$

3. 避免循环依赖

在实际使用中,可能会出现循环依赖的情况,例如源文件A依赖于源文件B,同时源文件B也依赖于源文件A。这种情况下,Makefile会出现死循环,并无限制地进行编译。为了避免这种情况,我们需要使用条件编译指令和递归编译。例如:

ifdef B_OB

OB = $(A_OB) $(B_OB)

else

OB = $(A_OB)

endif

A_OB = a.o

B_SRCS = b.c

ifdef B_SRCS

B_OB = $(B_SRCS:.c=.o)

VPATH = src/subdir

%.o : %.c

$(CC) $(CFLAGS) -c -o $@ $

endif

all: mn

mn: $(OB)

$(CC) $(CFLAGS) -o mn $(OB)

其中,$(ifdef B_OB)为条件编译指令,如果B_OB被定义,则进行OB的赋值;$(VPATH)表示查找源文件的路径;$(%.o : %.c)为递归编译指令,表示对源文件进行自身递归编译。通过以上技巧,可以有效地避免循环依赖的问题。

结语

Makefile是一个非常实用和重要的工具,掌握Makefile的编写技巧,能够大大节省工作时间和提高工作效率。本文介绍了Makefile的作用和编写技巧,希望通过本文的介绍,读者们能够掌握Linux编程的基本技巧,轻松编写Makefile,提高代码质量和可维护性,为开发者们带来更好的使用体验。

相关问题拓展阅读:

如何在linux下写makefile

直接vim或者vi编写,不配颤过不方便。如果有图形界面的话会有文本编辑器慧改,在里面编写就行了。或者在linux上安装eclipse集成开发环境,可以在eclipse里面建立培碧败Makefile工程,很方便。

linux中用C语言编写完模块后怎么编写makefile文件?用到什么命令?以什么格式编写?

1、先写Makefile编译出***.ko文件

模板如下,族闹高保存弯闷到命名为Makefile文件里,放到你代码的同级目录下

TARGET=my_proc.ko

LINUXDIR=/lib/modules/$(shell uname -r)/build

PWD=$(shell pwd)

obj-m :=

obj-m += my_proc.o

all: $(TARGET)

$(TARGET): $(OB)

make -C $(LINUXDIR) SUBDIRS=$(PWD) modules

clean:

rm -f modules.order Module.symvers $(TARGET) *.mod.c *.o

rm -rf .tmp_versions .mod* Module.markers

2、make

3、root权限下用命令插入模块

inod my_proc.ko

4、可以用你写的应用程序打开、操作模块了

5、查看模块命令

lod

cat /proc/modules

modinfo my_proc.ko

6、兆尺root下卸载模块

rmmod

vi Makefile #打开vi编辑器

在编辑器里输入以下内容:

#当只有一个文件需要编译的时候

finame:filename.c #冒号前面是要编译成的目标文件(可以任意命名),后面是你编写的C文件

gcc -o filename filename.c #gcc前面是按Tab制表符

#filename:filename.c 是指filename文件的生成要依赖filename.c文件

#然后换行后按Tab键,然后编写编译规则

#make命令一般是同时编译多个文件时才使用,以下是同时编写多个独立的C文件

#filename1和郑郑filename2……没有依赖关系

filename1:filename1.c

gcc -o filename1 filename1.c

filename2:filename2.c

gcc -o filename2 filename2.c

#makefile编译多个需要依赖(互相调用的文件)

main:main.o file1.o file2.o #main是最终要生成的目标文件,后面.o就是需要调用的文件的对象文件

main.o:main.c

gcc -c main.c #生成main.o对象文件,main.c里面是有主函数的

file1.o:file1.c

gcc -c file1.c

file2.o:file2.c

gcc -c file2.c

#以上差不多就可以用了

#一下是我找的例子

#include “mytool1.h”

void mytool1_print(char *print_str)

{

printf(“This is mytool1 print %s\n”,print_str);

}

/* mytool2.h */

#ifndef _MYTOOL_2_H

#define _MYTOOL_2_H

void mytool2_print(char *print_str);

#endif

/* mytool2.c */

#include “mytool2.h”

void mytool2_print(char *print_str)

{

printf(“This is mytool2 print %s\n”,print_str);

}

当然由于这个程序是很短的我们可以这样来编译

gcc -c main.c

gcc -c mytool1.c

gcc -c mytool2.c

gcc -o main main.o mytool1.o mytool2.o

这样的话我们也可以产生main 程序,而且也不时很麻烦.

# 这是上面那个程序的Makefile 文件

main:main.o mytool1.o mytool2.o

gcc -o main main.o mytool1.o mytool2.o

main.o:main.c mytool1.h mytool2.h

gcc -c main.c

mytool1.o:mytool1.c mytool1.h

gcc -c mytool1.c

mytool2.o:mytool2.c mytool2.h

gcc -c mytool2.c

有了这个Makefile 文件,不过我们什么时候修改了源程序当中的什么文件,我们只要执行

make 命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件她连理

都不想去理的。

下面我们学习Makefile 是如何编写的。

在Makefile 中也#开始的行都是注释行.Makefile 中最重要的是描述文件的依赖关系的说

明.一般的格式是:

target: components

TAB rule

之一行表示的是依赖关系.第二行是规则.

比如说我们上面的那个Makefile 文件的第二行

main:main.o mytool1.o mytool2.o

表示我们的目标(target)main 的依赖喊槐颂对象(components)是main.o mytool1.o mytool2.o

当倚赖的对象在目标修明慧改后修改的话,就要去执行规则一行所指定的命令.就象我们的上

面那个Makefile 第三行所说的一样要执行 gcc -o main main.o mytool1.o mytool2.o

注意规则一行中的TAB 表示那里是一个TAB 键

光在这说有点困难,我有个ppt里比较详细的讲解怎么进行,如果有需要的话,把你的邮箱留给我~~

看来你盯扮对makefile还不了解,先认真看看make使用手册吧,以下是make中文手凯旦灶册阅读地址迟基

关于linux 编写makefile的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 掌握Linux编程技巧,轻松编写Makefile (linux 编写makefile)