编写makefile(怎么编写Makefile生成静态库)

2024-01-21 03:00:02 :51

编写makefile(怎么编写Makefile生成静态库)

大家好,今天小编来为大家解答以下的问题,关于编写makefile,怎么编写Makefile生成静态库这个很多人还不知道,现在让我们一起来看看吧!

本文目录

怎么编写Makefile生成静态库

编写Makefile生成静态库的方法:方法一//////////////////////////////////////////////////////////////////divFIX=/usrLIBDIR=$(divFIX)/libINCLUDEDIR=$(divFIX)/include#$(DESTDIR) is usally empty. rpmbuild needs it.DESTDIR=CC=gccCFLAGS=LIBS=INCLUDES=AR=arall: hello.ahello.a: file1.o file2.o $(AR) -r $@ $^file1.o: file1.c $(CC) $(CFLAGS) -c $^ -o $@ $(LIBS) $(INCLUDES)file2.o: file2.c $(CC) $(CFLAGS) -c $^ -o $@ $(LIBS) $(INCLUDES)install: @echo Copying library files to $(DESTDIR)/$(LIBDIR): @cp -rp libthreadpool.a $(DESTDIR)/$(LIBDIR)/ @echo Copying head files to $(DESTDIR)/$(DATADIR): @cp -rp src/thread-pool.h $(DESTDIR)/$(INCLUDEDIR)/clean: rm -rf *.o \ *.auninstall: rm -rf $(LIBDIR)/hello.a\ $(INCLUDEDIR)/hello.h//////////////////////////////////////////////////////////////////////////方法二gcc -o hellofile.a file1.o file2.o -lc -lm -shared动态库gcc -o hellofile.so file1.o file2.o -lc -lm -shared# -lpthread 线程# -shared 共享库# -lm 表示连接名为“libm.a”的数学函数库# -lc 代表链接器将连接GCC的标准C库# -o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。# -g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。 # .a为后缀的文件,是由目标文件构成的档案库文件;# .so 为动态库。

makefile 文件介绍

makefile文件主要有以下五种组成部分。显式规则:显式规则说明了生成一个或多个目标文件的方法和步骤。这是在编写makefile文件时明显指出的,包括要生成的文件、生成文件的依赖文件以及生成的命令等。隐式规则:由于make工具有自动推导的功能,所以在编写makefile文件的时候可以利用该规则,简略地书写makefile。再由 make 工具本身自动推导需要使用的规则。变量的定义: make工具支持变量的定义,这些变量往往都是字符串,因此makefile中的变量更像是C语言中的宏。当makefile被执行时,其中的变量都会被展开到相应的引用位置上。文件指示:其包括三个部分,一个是在一个makefile中引用另一个makefile,就像C语言中的include一样。另一个是指根据某些情况指定makefile中的有效部分,就像C语言中的预编译tlif一样。还有就是定义一个多行的命令。注释: makefile 中支持行注释,这一点需要特别注意。makefile 中的注释和 shell脚本一样,其注释是用“#”字符。如果需要在 makefile中使用“#”字符,可以用‘\’对其进行转义。例如,“\#”表示一个‘#’字符。makefile文件的文件名最好命名为makefile或者Makefile。因为在默认的情况下,make命令会在当前目录下按顺序找寻这两个文件进行解释。用户也可以为makefile文件自定义一个文件名,例如,Make.makefile,Make.admin等。

如何自己编写Makefile

 相信很多朋友都有过这样的经历,看着开源项目中好几页的makefile文件,不知所云。在日常学习和工作中,也有意无意的去回避makefile,能改就不写,能用ide就用ide。其实makefile并没有想象的那么难写,只要你明白了其中的原理,自己实践几次。你也可以自己写makefile,让别人对你头来羡慕的目光。  下面本人介绍一下自己的学习成果,初学阶段,欢迎大家多多指正。  简单的说,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至可以在makefile中执行shell脚本。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。  关于程序的编译和链接  一般来说,无论是C还是C++,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile),一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。  编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。  链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。  下面我们开始看看如何自己写出makefile。  Makefile的规则  目标 : 需要的条件 (注意冒号两边有空格)    命令  (注意前面用tab键开头)  解释一下:  1 目标可以是一个或多个,可以是Object File,也可以是执行文件,甚至可以是一个标签。  2 需要的条件就是生成目标所需要的文件或目标  3 命令就是生成目标所需要执行的脚本  总结一下,就是说一条makefile规则规定了编译的依赖关系,也就是目标文件依赖于条件,生成规则用命令来描述。在编译时,如果需要的条件的文件比目标更新的话,就会执行生成命令来更新目标。  下面举个简单的例子说明。如果一个工程有3个头文件,和8个C文件,我们为了完成前面所述的那三个规则,我们的Makefile应该是下面的这个样子的。  edit : main.o kbd.o command.o display.o / insert.o search.o files.o utils.o cc -o edit main.o kbd.o command.o display.o / insert.o search.o files.o utils.o main.o : main.c defs.h cc -c main.c kbd.o : kbd.c defs.h command.h cc -c kbd.c command.o : command.c defs.h command.h cc -c command.c display.o : display.c defs.h buffer.h cc -c display.c insert.o : insert.c defs.h buffer.h cc -c insert.c search.o : search.c defs.h buffer.h cc -c search.c files.o : files.c defs.h buffer.h command.h cc -c files.c utils.o : utils.c defs.h cc -c utils.c clean : rm edit main.o kbd.o command.o display.o / insert.o search.o files.o utils.o  将上面的内容写入到Makefile文件中,然后执行make就可以进行编译,执行make clean就可以删除所有目标文件。解释一下,也就是说生成最终的目标文件edit,依赖于一系列的.o目标文件,而这些.o文件又是需要用源文件来编译生成的。  需要注意的是,clean后面没有条件,而clean本身也不是文件,它只不过是一个动作名字,其冒号后什么也没有,那么,make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。  make是如何工作的  在默认的方式下,也就是我们只输入make命令。那么,1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。 2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。 3、如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。 4、如果edit所依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程) 5、当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生命make的终极任务,也就是执行文件edit了。  makefile中使用变量  前面的知识已经足以让你自己完成一个简单的makefile了,不过makefile的精妙之处远不止如此,下面来看看如何在makefile中使用变量吧。  在上面的例子中,先让我们看看edit的规则:edit : main.o kbd.o command.o display.o / insert.o search.o files.o utils.o cc -o edit main.o kbd.o command.o display.o / insert.o search.o files.o utils.o  我们可以看到文件,那么我们需要在两个地方加(应该是三个地方,还有一个地方在clean中)。当然,我们的makefile并不复杂,所以在两个地方加也不累,但如果 makefile变得复杂,那么我们就有可能会忘掉一个需要加入的地方,而导致编译失败。所以,为了makefile的易维护,在makefile中我们可以使用变量。makefile的变量也就是一个字符串,理解成C语言中的宏可能会更好。  于是,我们使用变量objects  objects = main.o kbd.o command.o display.o / insert.o search.o files.o utils.o  这样一来,原来的makefile变成如下的样子:  objects = main.o kbd.o command.o display.o / insert.o search.o files.o utils.o edit : $(objects) cc -o edit $(objects) main.o : main.c defs.h cc -c main.c kbd.o : kbd.c defs.h command.h cc -c kbd.c command.o : command.c defs.h command.h cc -c command.c display.o : display.c defs.h buffer.h cc -c display.c insert.o : insert.c defs.h buffer.h cc -c insert.c search.o : search.c defs.h buffer.h cc -c search.c files.o : files.c defs.h buffer.h command.h cc -c files.c utils.o : utils.c defs.h cc -c utils.c clean : rm edit $(objects)  这样看起来方便多了吧,也更加省事了。如果有新的.o文件怎么办?当然是在objects里面添加了,这样只需要一处改变,很方便吧。  让make自动推导  GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。  只要make看到一个文件加在依赖关系中,如果make找到一个whatever.o,那么whatever.c,就会是whatever.o的依赖文件。并且 cc -c whatever.c 也会被推导出来,于是,我们的makefile再也不用写得这么复杂。我们的是新的makefile又出炉了。  objects = main.o kbd.o command.o display.o / insert.o search.o files.o utils.o edit : $(objects) cc -o edit $(objects)main.o : defs.h kbd.o : defs.h command.h command.o : defs.h command.h display.o : defs.h buffer.h insert.o : defs.h buffer.h search.o : defs.h buffer.h files.o : defs.h buffer.h command.h utils.o : defs.h  clean : rm edit $(objects)  当然,如果你觉得那么多的依赖有点不爽的话,好吧,没有问题,这个对于make来说很容易,谁叫它提供了自动推导命令和文件的功能呢?来看看最新风格的makefile吧。  objects = main.o kbd.o command.o display.o / insert.o search.o files.o utils.o edit : $(objects) cc -o edit $(objects)$(objects) : defs.h kbd.o command.o files.o : command.h display.o insert.o search.o files.o : buffer.h clean : rm edit $(objects)

如何编写makefile

你先用gcc把它给编译出来。然后再想用makefilegcc最一般的用法就是:gcc -o 要生成的可执行文件名 源代码文件名如:gcc -o hello.x hello.c如果一些头文件要指明的话,可以这样:gcc -o hello.x -I头文件所在的文件夹 -l一些库名 hello.c最通常,我们用到一些数学库。gcc -o hello.x -lm hello.cmakefile的话,你可以基于上述的语句进行修改:建议你看点资料,或一些典型的例子。但是注意的是规则那一行,得用Tab键打头。hello.x : hello.o gcc -o hello.x hello.o (这一行,得用Tab打头)hello.o : hello.c 头文件 gcc -c hello.o hello.c -I头文件所在目录 -lm (这一行,得用Tab打头)

Linux中编写了内核模块的C源程序之后怎么编写makefile文件的内容

make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。首先,我们用一个示例来说明Makefile的书写规则。以便给大家一个感兴认识。这个示例来源于GNU的make使用手册,在这个示例中,我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。一、Makefile的规则在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。target ... : prerequisites ...command......target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。prerequisites就是,要生成那个target所需要的文件或是目标。command也就是make需要执行的命令。(任意的Shell命令)这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。说到底,Makefile的东西就是这样一点,好像我的这篇文档也该结束了。呵呵。还不尽然,这是Makefile的主线和核心,但要写好一个Makefile还不够,我会以后面一点一点地结合我的工作经验给你慢慢到来。内容还多着呢。:)二、一个示例正如前面所说的,如果一个工程有3个头文件,和8个C文件,我们为了完成前面所述的那三个规则,我们的Makefile应该是下面的这个样子的。edit : main.o kbd.o command.o display.o /insert.o search.o files.o utils.occ -o edit main.o kbd.o command.o display.o /insert.o search.o files.o utils.omain.o : main.c defs.hcc -c main.ckbd.o : kbd.c defs.h command.hcc -c kbd.ccommand.o : command.c defs.h command.hcc -c command.cdisplay.o : display.c defs.h buffer.hcc -c display.cinsert.o : insert.c defs.h buffer.hcc -c insert.csearch.o : search.c defs.h buffer.hcc -c search.cfiles.o : files.c defs.h buffer.h command.hcc -c files.cutils.o : utils.c defs.hcc -c utils.cclean :rm edit main.o kbd.o command.o display.o /insert.o search.o files.o utils.o反斜杠(/)是换行符的意思。这样比较便于Makefile的易读。我们可以把这个内容保存在文件为“Makefile”或“makefile”的文件中,然后在该目录下直接输入命令“make”就可以生成执行文件edit。如果要删除执行文件和所有的中间目标文件,那么,只要简单地执行一下“make clean”就可以了。在这个makefile中,目标文件(target)包含:执行文件edit和中间目标文件(*.o),依赖文件(prerequisites)就是冒号后面的那些 .c 文件和 .h文件。每一个 .o 文件都有一组依赖文件,而这些 .o 文件又是执行文件 edit 的依赖文件。依赖关系的实质上就是说明了目标文件是由哪些文件生成的,换言之,目标文件是哪些文件更新的。在定义好依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,一定要以一个Tab键作为开头。记住,make并不管命令是怎么工作的,他只管执行所定义的命令。make会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的话,那么,make就会执行后续定义的命令。这里要说明一点的是,clean不是一个文件,它只不过是一个动作名字,有点像C语言中的lable一样,其冒号后什么也没有,那么,make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。要执行其后的命令,就要在make命令后明显得指出这个lable的名字。这样的方法非常有用,我们可以在一个makefile中定义不用的编译或是和编译无关的命令,比如程序的打包,程序的备份,等等。

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

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.cfilename2: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.cfile2.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_Hvoid 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.cgcc -c mytool1.cgcc -c mytool2.cgcc -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.omain.o:main.c mytool1.h mytool2.h gcc -c main.cmytool1.o:mytool1.c mytool1.h gcc -c mytool1.cmytool2.o:mytool2.c mytool2.h gcc -c mytool2.c有了这个Makefile 文件,不过我们什么时候修改了源程序当中的什么文件,我们只要执行make 命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件她连理都不想去理的。下面我们学习Makefile 是如何编写的。在Makefile 中也#开始的行都是注释行.Makefile 中最重要的是描述文件的依赖关系的说明.一般的格式是:target: componentsTAB 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 键

萌新求助、gcc编译c++动态库编写makefile

假设有下面几个c++文件:wherewhen.h wherewhen.ccountdown.h countdown.c 包含了math.h, 需要连接库文件main.c 主函数, main.c 包含了两个头文件 wherewhen.h and countdown.h1、第一种编译方法:g++ -Wall -g wherewhen.c countdown.c main.c -lm -o myprogram生成可执行文件myprogram2、第二中编译方法, 分别编译各个文件:g++ -Wall -g -c wherewhen.cg++ -Wall -g -c countdown.cg++ -Wall -g -c main.cg++ -g wherewhen.o countdown.o main.o -lm -o myprogram

在什么软件下可以编写makefile,比如编写c语言可以在VC6.0下编写,那么makefile可以在那里写呢

vc6直接就可以直接导出你正在的工程的make文件。

菜单:Project-》Export Makefile...打开导出makefile对话框,选择你要导出makefile的工程,点OK,就会在你工程目录下生成工程名.mak文件,如图:咐猜咐

 

 

 

你可以用文本器直接衡纯修改.mak文件,但一般情况下没必要自己去修改,直接在vc6里配置好工程的相关信息,导出成.mak文件即可。

执行.mak文件的话,打开兆扮命令提示符,cd到.mak文件所在位置,然后输入:

nmake /f mak文件名 回车

即可开始编译链接程序,效果和你在VC6里build是一样的。

如果你还想了解更多这方面的信息,记得收藏关注本站。

编写makefile(怎么编写Makefile生成静态库)

本文编辑:admin
Copyright © 2022 All Rights Reserved 威海上格软件有限公司 版权所有

鲁ICP备20007704号

Thanks for visiting my site.