
在Linux下使用Java编程需要经过编译过程,而Makefile作为一种常见的自动化构建工具,可以大大简化这个过程。本文将介绍一些Makefile的优化技巧,帮助提高Java程序的编译效率。
一、Makefile的基本使用
Makefile是一种文本文件,包含了一系列规则和命令。它可以用来指定如何编译和构建一个程序。Makefile的基本格式如下:
target: dependencies
recipe
其中,target表示编译目标,dependencies表示目标所需要的依赖文件,recipe表示如何生成该目标文件的命令。一个Makefile可以包含多个目标和规则,如下所示:
all: mn.o mylib.o
gcc -o myprog mn.o mylib.o
mn.o: mn.c
gcc -c mn.c
mylib.o: mylib.c
gcc -c mylib.c
clean:
rm -f *.o myprog
上述Makefile中,all是编译的目标,mn.o和mylib.o是all的依赖文件,通过gcc命令生成myprog可执行文件。同时,还定义了clean的目标,用来清理生成的目标文件和可执行文件。
二、优化Makefile
1. 使用变量
Makefile中可以使用变量来代替一些常量,从而简化代码。例如,可以定义一个变量CC表示编译器:
CC = gcc
然后在定义目标时使用$(CC)即可代替具体的编译器名字:
all: mn.o mylib.o
$(CC) -o myprog mn.o mylib.o
2. 使用模式规则
模式规则可以匹配多个目标,从而减少重复代码。例如,可以使用%.o表示所有的目标文件,然后使用%.c表示这些目标文件对应的C源文件:
%.o: %.c
$(CC) -c $
上述规则表示,所有的目标文件都是由对应的C源文件通过$(CC)命令生成的。$
3. 使用phony目标
phony目标表示一个伪目标,它不会生成对应的文件,只是一些命令的。例如,可以定义一个clean的phony目标:
.PHONY: clean
clean:
rm -f *.o myprog
这样,在命令行中使用make clean时,就会执行这个目标中的命令,删除生成的所有目标文件和可执行文件。
4. 使用文件依赖
Makefile还可以使用文件依赖来自动更新目标文件。例如,可以使用头文件的依赖关系来检测源文件是否需要重新编译:
mn.o: mn.c mylib.h
$(CC) -c mn.c
mylib.o: mylib.c mylib.h
$(CC) -c mylib.c
这样,在修改了mylib.h头文件后,make命令会自动重新编译对应的源文件。
5. 使用静态模式规则
静态模式规则可以匹配多个目标,同时将所有目标一起编译,从而提高编译效率。例如,可以将模式规则改成静态模式规则:
$(OBJ_PATH)/%.o: %.c
$(CC) $(CFLAGS) $(INCLUDES) -c $
在以前的Makefile中,诸如mn.o和mylib.o这些目标都是单独编译的,如果代码量很大时,需要很长的时间来完成编译。但是使用静态模式规则后,可以将所有的目标一起编译。
三、结论
Makefile是一种非常强大的自动化构建工具,对于Java编程也很有用。通过使用变量、模式规则、phony目标、文件依赖和静态模式规则等技巧,可以使Makefile更加简洁、优雅,并且提高编译效率,减少重复劳动。希望本文对大家有所帮助,让Java程序的开发更加高效。
相关问题拓展阅读:
- Linux平台Makefile文件的编写基础篇
- linux里面的make和makefile是做什么的?
- 关于linux的makefile
Linux平台Makefile文件的编写基础篇
目的:
基本掌握了 make 的用法,能在Linux系统上编程。
环境:
Linux系统,或者有一台Linux服务器,通过终端连接。一句话:有Linux编译环境。
准备:
准备三个文件:file1.c, file2.c, file2.h
file1.c:
#include
#include “file2.h”
int main()
{
printf(“print file1$$$$$$$$$$$$ “);
File2Print();
return 0;
}
file2.h:
#ifndef FILE2_H_
#define FILE2_H_
#ifdef __cplusplus
extern “C” {
#endif
void File2Print();
#ifdef __cplusplus
}
#endif
#endif
file2.c:
#include “file2.h”
void File2Print()
{
printf(“Print file2********************** “);
}
基础:
先来个例子:
有这么个Makefile文件。(文件和Makefile在同一目录)
=== makefile 开始 ===
helloworld:file1.o file2.o
gcc file1.o file2.o -o helloworld
file1.o:file1.c file2.h
gcc -c file1.c -o file1.o
file2.o:file2.c file2.h
gcc -c file2.c -o file2.o
clean:
rm -rf *.o helloworld
=== makefile 结束 ===
一个 makefile 主要含有一系列的规则,如下绝枣:
A: B
(tab)
(tab)
每个命令行前都必须有tab符号。
上面的makefile文件目的就是要编译一个helloworld的可执行文件。让我们一句一句来解释:
helloworld : file1.o file2.o: helloworld依赖file1.o file2.o两个目标文件。
gcc File1.o File2.o -o helloworld: 编译出helloworld可执行文件。-o表示你指定 的目标文件名。
file1.o : file1.c: file1.o依赖file1.c文件。
gcc -c file1.c -o file1.o: 编译出file1.o文件。-c表示gcc 只把给它的文件编译成目标文件, 用源码慧梁文件的文件名命名但把其后缀由“.c”或“.cc”变成“.o”。在这句中,可以省略-o file1.o,编译器默认生成file1.o文件,这就是-c的作用。
file2.o : file2.c file2.h
gcc -c file2.c -o file2.o
这两句和上两句相同。
clean:
rm -rf *.o helloworld
当用户键入make clean命令时,会并碧拆删除*.o 和helloworld文件。
如果要编译cpp文件,只要把gcc改成g++就行了。
写好Makefile文件,在命令行中直接键入make命令,就会执行Makefile中的内容了。
到这步我想你能编一个Helloworld程序了。
上一层楼:使用变量
上面提到一句,如果要编译cpp文件,只要把gcc改成g++就行了。但如果Makefile中有很多gcc,那不就很麻烦了。
第二个例子:
=== makefile 开始 ===
OB = file1.o file2.o
CC = gcc
CFLAGS = -Wall -O -g
helloworld : $(OB)
$(CC) $(OB) -o helloworld
file1.o : file1.c file2.h
$(CC) $(CFLAGS) -c file1.c -o file1.o
file2.o : file2.c file2.h
$(CC) $(CFLAGS) -c file2.c -o file2.o
clean:
rm -rf *.o helloworld
=== makefile 结束 ===
这里我们应用到了变量。要设定一个变量,你只要在一行的开始写下这个变量的名字,后 面跟一个 = 号,后面跟你要设定的这个变量的值。以后你要引用 这个变量,写一个 $ 符号,后面是围在括号里的变量名。
CFLAGS = -Wall -O –g,解释一下。这是配置编译器设置,并把它赋值给CFFLAGS变量。
-Wall: 输出所有的警告信息。
-O: 在编译时进行优化。
-g: 表示编译debug版本。
这样写的Makefile文件比较简单,但很容易就会发现缺点,那就是要列出所有的c文件。如果你添加一个c文件,那就需要修改Makefile文件,这在项目开发中还是比较麻烦的。
再上一层楼:使用函数
学到这里,你也许会说,这就好像编程序吗?有变量,也有函数。其实这就是编程序,只不过用的语言不同而已。
第三个例子:
=== makefile 开始 ===
CC = gcc
XX = g++
CFLAGS = -Wall -O –g
TARGET = ./helloworld
%.o: %.c
$(CC) $(CFLAGS) -c lt; -o
%.o:%.cpp
$(XX) $(CFLAGS) -c lt; -o
SOURCES = $(wildcard *.c *.cpp)
OB = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))
$(TARGET) : $(OB)
$(XX) $(OB) -o $(TARGET)
chmod a+x $(TARGET)
clean:
rm -rf *.o helloworld
=== makefile 结束 ===
函数1:wildcard
产生一个所有以 ‘.c’ 结尾的文件的列表。
SOURCES = $(wildcard *.c *.cpp)表示产生一个所有以 .c,.cpp结尾的文件的列表,然后存入变量 SOURCES 里。
函数2:patsubst
匹配替换,有三个参数。之一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要被处理的由空格分隔的列表。
OB = $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCES)))表示把文件列表中所有的.c,.cpp字符变成.o,形成一个新的文件列表,然后存入OB变量中。
%.o: %.c
$(CC) $(CFLAGS) -c lt; -o
%.o:%.cpp
$(XX) $(CFLAGS) -c lt; -o
这几句命令表示把所有的.c,.cpp编译成.o文件。
这里有三个比较有用的内部变量。 扩展成当前规则的目的文件名, lt; 扩展成依靠 列表中的之一个依靠文件,而 $^ 扩展成整个依靠的列表(除掉了里面所有重 复的文件名)。
linux里面的make和makefile是做什么的?
Windows 下面有IDE, Linux呢? Linux vim+make+gcc 哈哈
1、make:是一个非常重要的编译命令,本质上它是一个程序。利用make工具,可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员来说简直就是一盯模场灾难。而make工具则可自动完成编译工作,并且可以只对程序员在上次编译后修改过的部分进行编译。段则亩
2、Makefile文件 :Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作,本质上makefile文件是个文本文件,用于配置编译过程。makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。makefile 文件是许多编译器–包括 Windows NT 下的编译器–维护编译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改 makefile 文件而已。
3、在 UNIX 系统中,习惯使用 Makefile 作为 makfile 文件。如果要使用其他文件作为 makefile,则可利用类似下面的 make 命令选项指定 makefile 文件:
$ make -f Makefile.debug
例如,一个名为prog的程序由三个C源文件filea.c、fileb.c和filec.c以及库文件LS编译生成,这三个文件还分别包含自己的头文件a.h 、b.h和c.h。通常情况下,C编译器将会输出三个目标文件filea.o、fileb.o和filec.o。假设filea.c和fileb.c都要声明用到握森一个名为defs的文件,但filec.c不用。即在filea.c和fileb.c里都有这样的声明:
#include “defs”
那么下面的文档就描述了这些文件之间的相互联系:
#It is a example for describing makefile
prog : filea.o fileb.o filec.o
cc filea.o fileb.o filec.o -LS -o prog
filea.o : filea.c a.h defs
cc -c filea.c
fileb.o : fileb.c b.h defs
cc -c fileb.c
filec.o : filec.c c.h
cc -c filec.c
这个描述文档就是一个简单的makefile文件。
make是进行代码编译的工具,它会自动读取makefile文件,然后调用编译工具来进行软件竖姿纯的编译和安装工作。makefile是编译的余咐依据或者说编册链译的命令代码了。
这是两个命令。用于编译文件。就是陪乱从网上下载程序源代码,在本族棚机亲编译成程序使用。这样做的好处是代码可以自己修改,生成适合自己喜好的程序,还有一点兆乱则是在下载过程中省网络资源。
makefile提供一组脚本,做磨腔make程纯衫游薯序解释makefile ,按照makefile的规则来编译,安装源代码
关于linux的makefile
大写的cc是makefile中自己定并闭返义的变量。
因为编译器有很多种,比如gcc,
llvm,
icc。
你可以使用任意一种态颤编译器绝饥来编译代码,
定义
cc
=
gcc,
那么cc就是gcc
命腔握禅令行必需以键开始,以和Makefile其他行区别。
就是说所有的命令行必需以
字符开始,但并不是所有的以键出现行都是命令行。但make程序会把出现在之一条规则之后的所伍尘有以字符开始的行都作为命皮灶令行来处理。
你下面的rm语法上没问题的,所以应该是的问题。linux makefile java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux makefile java,深入了解Linux下Java编程的Makefile优化技巧,Linux平台Makefile文件的编写基础篇,linux里面的make和makefile是做什么的?,关于linux的makefile的信息别忘了在本站进行查找喔。
香港服务器首选树叶云,2H2G首月10元开通。
树叶云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/176097.html<