Linux平台Makefile文件的编写基础篇

#ifndefFILE2_H_#defineFILE2_H_

#ifdef__cplusplus

外部“C”{

#endif

voidFile2Print();

#ifdef__cplusplus

}

#endif

#endif

file2.c:#include"file2.h"voidFile2Print(){printf("Printfile2************"****************");

基础知识:先举个例子:有一个这样的Makefile(该文件与Makefile在同一个目录下))===开始了makefile===helloworld:file1.ofile2.ogccfile1.ofile2.o-ohelloworldfile1.o:file1.cfile2.hgcc-cfile1.c-ofile1.o

file2.o:file2.cfile2.h

gcc-cfile2.c-ofile2.o

干净:

rm-rf*.ohelloworld

====makefile结束====

每个命令行前面必须有一个选项卡图标

上面makefile的目的是编译我们逐句解释一下:helloworld:file1.ofile2.o:helloworld依赖于两个目标文件file1.ofile2.o

gccFile1.oFile2.o-你好世界:编译可执行文件helloworld。
-o表示您指定的目标文件的名称

file1.o:file1.c:file1.o依赖于file1.c。

gcc-cfile1.c-ofile1.o:编译file1.o。
-c表示gcc只是将给定的文件编译为目标文件,用源代码文件的文件名命名它,但将其后缀从“.c”或“.cc”更改为“.o”。
这句话中,-ofile1.o可以省略,编译器默认创建file1.o。
这就是-c的作用。

file2.o:file2.cfile2.hgcc-cfile2.c-ofile2.o

这两句与前两句相同。

Clean:

rm-rf*.ohelloworld

当用户输入makeclean命令时,*.o和helloworld文件将被删除。

如果要编译cpp文件,只需将gcc改为g++即可。

写完Makefile后,直接在命令行输入make命令,Makefile的内容就会被执行。

此时我认为你可以编写Helloworld。

如上所述,如果要编译cpp文件,只需将gcc改为g++即可。
但如果Makefile中有很多GCC,那就很烦人了。

第二个例子:

===makefilestart===OBJS=file1.ofile2.oCC=gccCFLAGS=-Wall-O-ghelloworld:$(OBJS)$(CC)$(OBJS)-ohelloworldfile1.o:file1.cfile2.h$(CC)$(C标志)-cfile1.c-ofile1.ofile2.o:file2.cfile2.h$(CC)$(CFLAGS)-cfile2.c-ofile2.o

干净:

rm-rf*.ohelloworld===makefile结束====

这里我们应用变量。
要设置变量,只需在行的开头键入变量的名称,然后输入=符号,然后输入要设置的变量的值。
要在将来引用此变量,请键入$符号,后跟括号中的变量名称。

CFLAGS=-Wall-O–g,解释一下。
这将配置编译器设置并将其分配给CFFLAGS变量。

-Wall:输出所有警告消息。

-O:编译时优化。

-g:表示补丁版本已编译。

这样写的Makefile比较简单,但是缺陷很容易发现,那就是必须插入。
所有c文件。
如果添加c文件,就需要修改Makefile,这在项目开发中非常麻烦。

学完这个,你可能会说,这像编程吗?有变量,也有函数。
其实这就是编程,只是使用的语言不同而已。

第三个例子:

===makefilestart====CC=gcc

XX=g++CFLAGS=-Wall-O–g

目标=./helloworldd

%.o:%.c

%.o:%.cpp

来源=$(通配符*.c*.cpp)OBJS=$(patsubst%.c,%.o,$(patsubst%.cpp,%.o,$(SOURCES)))

$(目标):$(OBJS)$(XX)$(OBJS)-o$(目标)

chmoda+x$(目标)

清理:

rm-rf*.ohelloworld====ENDmakefile===

函数1:通配符

使用“以.c结尾的文件列表”创建文件结尾。

SOURCES=$(wildcard*.c*.cpp)表示创建所有以.c和.cpp结尾的文件的列表,然后将它们存储在SOURCES变量中。

函数2:patsubst

匹配替换,有3个参数。
第一个是需要匹配的模式,第二个指示它将被替换为什么,第三个是需要处理的以空格分隔的列表。

OBJS=$(patsubst%.c,%.o,$(patsubst%.cc,%.o,$(SOURCES)))表示删除文件中所有.c和.cpp字符变成列表.o,创建一个新的文件列表,然后将其存储在OBJS变量中。

%.o:%.c

%.o:%.cpp

这些命令的意思是把所有.c和.cpp文件编译成.o文件。

这里有三个最有用的内部变量。
[emailprotected]扩展当前规则的目标文件名,扩展<;到依赖项列表中的第一个依赖文件,$^扩展到整个依赖项列表(删除所有重复的文件名)。

chmoda+x$(TARGET)表示强制helloworld成为可执行文件。

哪位大神帮我下,怎么编写linux下makefile文件?

例如,如果您有一个文件hello.c:#includemain(){printf("Hello,world!\n");}您编写另一个Makefile:Hello:hello.cgcchello.c-oHello然后,直接输入命令:make,就会得到一个名为Hello的可执行文件。
最后发出命令:./Hello,可以看到执行结果:Hello,World注意:“gcc”前面必须有一个Tab键作为执行命令。

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

viMakefile#打开vi编辑器,在编辑器中输入以下内容:#如果只有一个需要编译的文件finame:filename.c#冒号前面是要编译的目标文件(可以是任意名称),接下来就是你写的C文件了。
gcc-ofilenamefilename.c#gcc前面有一个制表符。
#filename:filename.c代表filena。
me文件的创建取决于filename.c文件。
#然后在新行后按Tab键,写入编译规则。
#make命令通常用于同时编译多个文件。
同时写入多个独立的C文件#filename1和filename2...无依赖filename1:filename1.cgcc-ofilename1filename1.cfilename2:filename2.cgcc-ofilename2filename2.c#makefile创建多个必须相互依赖的文件(文件互相调用)。
main:main.ofile1.ofile2.o#main是最终要创建的目标文件,接下来的.o是需要调用的文件。
目标文件main.o:main.cgcc-cmain.c#创建main.o目标文件。
文件main.c包含了主函数file1.o:file1.cgcc-cfile1.cfile2.o:file2.cgcc-cfile2.c。
#上面的内容就差不多可以使用了。
#这是我正在寻找的示例#include"mytool1.h"voidmytool1_print(char*print_str){printf("Thisismytool1print%s\n",print_str);}/*mytool2.h*/#ifndef_MYTOOL_2_H#define_MYTOOL_2_Hvoidmytool2_print(char*print_str);#endif/*mytool2.c*/#include"mytool2.h"voidmytool2_print(char*print_str){printf("Thisismytool2print%s\n",print_str);}当然,由于这个程序很短,你可以将gcc-cmain.cgcc-cmytool1.cgcc-cmytool2.cgcc-omainmain编译为如下:有。
omytool1.omytool2.o这种情况下,还可以创建主程序,这有时很麻烦。
#上述程序的Makefilemain:main.omytool1.omytool2.ogcc-omainmain.omytool1.omytool2.omain.o:main.cmytool1.hmytool2。
hgcc-cmain.cmytool1.o:mytool1.cmytool1.hgcc-cmytool1.cmytool2.o:mytool2.cmytool2.hgcc-cmytool2.c有了这个Makefile,在修改源程序文件时只需要运行make命令即可。
它编译与我们修改的文件相关的文件,她至不想处理其他文件。
接下来,我们将学习Makefile是如何编写的。
Makefile中所有以#开头的行都是注释行。
Makefile中最重要的是文件依赖关系的描述。
一般格式为:第一行表示依赖关系。
例如,上面Makefile的第二行main:main.omytool1.omytool2.o,代表目标(targ)。
et)main的依赖对象(组件)为main.omytool1.omytool2.o,如果修改target后修改依赖对象,则必须执行规则行中指定的命令,如Makefile的第三行。
如上所述,您需要运行gcc-omainmain.omytool1.omytool2.o。
规则行中的TAB表示TAB键的存在。