如何使用Linux下的make命令? (linux .make)

make是一个非常常用的命令,在Linux系统中经常被用来编译程序。通常情况下,我们可以使用make命令自动完成编译操作,从而使得我们的开发效率得到很大的提升。本文将会介绍如何使用Linux下的make命令,帮助你更好地管理你的工程。

一、什么是make?

make是一个自动化构建工具,它可以将源代码文件自动编译成可执行文件,从而实现程序的自动构建。make命令调用一个Makefile文件,在该文件中定义了源代码文件及其依赖关系,以及编译及链接的规则。Makefile文件通过一个特定的格式来描述这些规则,从而使用make命令来生成目标文件。

二、为什么需要make?

在Linux系统中,当你想运行一个程序时,你需要先编译它。编译代码的过程需要多个步骤,包括编译、链接等。如果代码很简单,这些步骤可能还可以通过手动的方式完成,但是如果代码很复杂,或者它需要依赖很多的库文件等,就会变得非常困难。这时,我们需要一个自动化的工具来帮助我们完成这个过程。

make命令就是这样一个工具,它可以自动化完成编译的过程。当我们修改了一些源代码文件时,make会自动识别出哪些文件需要重新编译,从而帮助我们更加高效地完成代码的开发。

三、如何编写Makefile?

Makefile是一个特定格式的文件,用于定义编译规则。在Makefile中,我们会定义以下几种元素:

1. 目标(Target):可生成的文件,如可执行文件、库文件等。

2. 依赖(Dependency):生成目标文件时所需要的源代码文件或其他目标文件。

3. 命令(Command):当目标文件所依赖的所有文件都存在时,需要执行的命令。

下面是一个简单的Makefile例子:

“`

all: mn

mn: mn.o hello.o

gcc -o mn mn.o hello.o

mn.o: mn.c hello.h

gcc -c mn.c

hello.o: hello.c hello.h

gcc -c hello.c

clean:

rm -f mn *.o

“`

在这个例子里,我们要编译一个包含mn函数的程序。为了生成该程序,我们需要编译mn.c和hello.c,并且这两个文件还有一个共同的头文件hello.h。我们假设在编译这两个文件时都需要使用gcc编译器。现在,我们就需要将上面的信息写入一个Makefile文件中。

之一行声明了一个目标为“all”,该目标依赖于“mn”的目标。当我们在命令行中输入“make all”时,就会执行生成“mn”目标的命令。

第二行定义了生成“mn”目标所需要的依赖文件。我们将编译出两个目标文件“mn.o”和“hello.o”。

第三行是我们所需要的命令。它告诉make如何将上面的两个目标文件链接起来生成“mn”目标文件。

第四和第五行定义了生成“mn.o”和“hello.o”所需的依赖关系和命令。

最后一个目标是“clean”,用于在目录中删除所有的目标文件和二进制文件。由于这不是一个文件生成目标,所以make不会自动生成它。

四、如何使用make命令?

使用make命令很简单,只需要在终端中进入到Makefile所在的目录下,然后输入“make”命令即可。

make命令的基本用法如下:

“`

make [选项] [目标]

“`

其中,选项包括:

1. -f:可以指定一个特定的Makefile文件。

2. -n:只打印命令,不执行它们。

3. -B:强制重新生成目标,即忽略文件的时间戳。

4. -C:可以指定目录,在该目录中执行make命令。

目标即为Makefile中所定义的目标。

例如,如果我们想生成上述Makefile文件中的所有目标,可以在终端中输入:

“`

make all

“`

这时,make会自动识别出mn.o和hello.o这两个目标文件是否需要重新编译,然后再将它们链接成可执行文件mn。如果make命令执行成功,我们就可以在命令行中直接运行该程序。

通过使用make命令及Makefile文件,我们可以方便地进行代码编译并生成目标文件。在Linux系统中,使用make可以大大提高代码开发的效率,减少手动编译过程的错误。同时,我们还可以使用make命令来自动化管理我们的工程,帮助我们更好地组织代码和程序结构。如果你还不会使用make命令,那么赶紧学起来吧!

相关问题拓展阅读:

linux 如何用make命令带参数详解,什么意思

1.socket是属于LINUX下的进程间通信的一种方式BSD,(socket)套接字困清稿。

既可以实现同一台主机间的进程间通信,也可以实现不同主机间的进程间通信,

也是操作系统给应用程序提供的用于网络通信的接口。

在Linux下,由于一切皆文件,所以socket也是一种文件。可以通过文件描述符去操作。

2.IP号:主机的唯一标识。

子网掩码:用于判断数据包向外网还是向内网发送。

IP地址在使用必须转换为二进制形式(inet_addr)。

对应的端口号转换(htons);

IP区分主机,端口号区分进程。

3.客户端的创建(对应的函数)

(1)创建SOCKET套接字 (socket)

(2)绑定地址信息(bind)(这一步骤可以省略,系统会自动分配)

(3)发送连接请求(connect)

(4)收发消息(send/recv)

(5)关闭套接字 (close)

4.服务器的创建(对应的函数)

(1)创建SOCKET套接字 (socket)

(2)绑定地址信息(bind)(服务器对应的IP地址和端口号)

(3)创建一个汪孝监听队列(listen)

(4)接受连接请求 (accept)

(5)收发消息 (send/recv)

(6)关闭套接字 (close)

下面就是客户端的代码如下:

#include

#include

#include

#include

#include

#include

int main()

{

//定义Internet协议结构,客户端的IP信息

struct sockaddr_in myaddr;

memset(&myaddr,0,sizeof(myaddr));

myaddr.sin_family = PF_INET;

myaddr.sin_port = htons(1314);

myaddr.sin_addr.s_addr = inet_addr(“127.0.0.1”);

//1.创建套接字

int clientId = socket(PF_INET,SOCK_STREAM,0);

if(clientId

#include

#include

#include

#include

#include

int main()

{

//定义Internet协议结构,服务器的端口号和IP地址

struct sockaddr_in myaddr;

memset(&myaddr,0,sizeof(myaddr));

myaddr.sin_family = PF_INET;

myaddr.sin_port = htons(1314);

myaddr.sin_addr.s_addr = inet_addr(“127.0.0.1”);

//1.创建套接字

int uouo123 = socket(PF_INET,SOCK_STREAM,0);

if(uouo123

{

perror(“serverFd\n”);

return -1;

}

printf(“socket ok\n”);

//2.绑定地址信息

int ret = bind(uouo123,(struct sockaddr *)&myaddr,sizeof(myaddr));

if(ret

{

perror(“bind\n”);

close(uouo123);

return -1;

}

printf(“bind ok\n”);

//3.创建一个监听队列

if(listen(uouo123,10)

{

perror(“listen\n”);

close(uouo123);

return -1;

}

printf(“listening….\n”);

//4.接受链接请求

int conId=accept(uouo123,NULL,NULL);

if(conId

{

perror(“accept\n”);

close(uouo123);

return -1;

}

printf(“accept ok\n”);

//5.收发消息

while(1)

{

char buf;

memset(buf,0,1024);

printf(“please input message (to xldclient)\n”);

gets(buf);

if(strcmp(buf,”quit”)==0)

{

break;

}

ret = send(conId,buf,sizeof(buf),0);

if(ret

{

perror(“send\n”);

close(uouo123);

close(conId);

return -1;

}

ret = recv(conId,buf,sizeof(buf),0);

if(ret

{

perror(“recv\n”);

close(uouo123);

close(conId);

return -1;

}

printf(“from xldclient:%s\n”,buf);

}

//6.关闭套接字

close(uouo123);

close(conId);

return 0;

在linux系统应用make命令时,makefile 与makefile有何区别

分析linux make命令段磨与Makefile的区别:

1、make命令有一些内置的默认功能,但是光有这个还是不知道怎么build程序。必须提供一个文件告诉make应用程序的构造,这个文件就是makefile。

2、Make和makefile提供了强大的功能来管理项目的编译以及发布install到指定文件夹。

3、make的原理是执行一个叫Makefile文件里的指令,make的基本用处是自动根据makefile里的指握橡斗令来编译源文件。还可以用来做比如安装软件,卸载软件等事情,但前提是在makefile里写了。

4、比如makefile里有这么些内容:

install :

然后用make install的话,make程序就会按照上面install:后面的指令执行安装,uninstall也是一样的道理,大部分的作者会写有卸载的部分,这时只要简单地执行make unistall就可以,如果作者懒没有写,那就只有根据make install中的步骤,把什么文件拷到哪去了,然后分别手动删除。还有关如滑键的一点是,编译安装完成后,不要删除源代码,不然就算作者写了unnistall目标,也没有makefile可以执行了。

  Make命令

  在linux make命令后不仅可以出现宏定义,还可以跟其他命令行参数,这些参数指定了需要编译的目标文件。其标准形式为:

  target1 :

  

  方括号中间的部分表示可选项。Targets和dependents当中可以包含字符、数字、句点和”/”符号。除了引用,commands中不能含有”#”,也不允许换行。

  在通常的情况下命令行参数中只含有一个”:”,此时command序列通常和makefile文件中某些定义文件间依赖关系的描述行有关。如果与目标相关连的那些描述行指定了相关的command序列,那么就执行这些相关的command命令,即使在分号和(tab)后面的aommand字段甚至有可能是NULL。如果那些与目标相关连的行没有指定command,那么将调用系统默认的目标文件生成规则。

  如果命令行参数中含有两个冒号”::”,则此时的command序列也许会和makefile中所有描述文件依赖关系的行有关。此时将执行那些与目标相关连的描述行所指向的相关命令。同时还将执行build-in规则。如果在执行command命令时返回了一个非”0″的出错信号,例如makefile文件中出现了错误的目标文件名或者出现了以连字符打头的命令字符串,make操作一般斗亮和会就此终止,但如果make后带有”-i”参数,则make将键逗忽略此类出错信号。Make命本身可带有四种参数:标志、宏定义、描述文件名和目标文件名。其标准形式为:

  Make

  Unix系统下标志位flags选项及其含义为:

  ◆-f file指定file文件为描述文件,如果file参数为”-“符,那么描述文件指向标准输入。如果没有”-f”参数,则系统将默认当前目录下名为 makefile或者名为Makefile的文件为描述文件。在linux中, GNU make 工具在当前工作目录中按照GNUmakefile、makefile、Makefile的顺序搜索 makefile文件。

  ◆-i 忽略命令执行返回的出错信息。

  ◆-s 沉默模式,在执行之前不输出相应的命令行信息。

  ◆-r 禁止使用build-in规则。

  ◆-n 非执行模式,输出所有执行命令,但并不执行。

  ◆-t 更新目标文件。

  ◆-q make操作将根据目标文件是否已经更新返回”0″或非”0″的状态信息。

  ◆-p 输出所有宏定义和目标文件描述。

  ◆-d Debug模式,输出有关文件和检测时间的详细信息。

  linux下make标志位的常用选项与Unix系统中稍有不同,下面我们只列出了不同部分:

  ◆-c dir 在读取 makefile 之前改变到指定的目录dir。

  ◆-I dir 当包含其他 makefile文件时,利用该选项指定搜索目录。

  ◆-h help文挡,显示所有的make选项。

  ◆-w 在处理 makefile 之前和之后,都显示工作目录。

  通过命令行参数中的target ,可指定make要编译的目标,并且允许同时定义编译多个目标,操作时按照从左向右的顺序依次编译target选项中指定的目标文件。如果命令行中没有指定目标,则系统默认target指向描述文件中之一个目标文件。

  通常,makefile 中还定义有 clean 目标,可用来清除编译过程中的中间文件,例如:

  clean:

  rm -f *.o

  运行 make clean 时,将执行 rm -f *.o 命令,最终删除所有编译过程中产生的所有中间文件。

  隐含规则

  在make 工具中包含有一些内置的或隐含的规则,这些规则定义了如何从不同的依赖文件建立特定类型的目标。Unix系统通常支持一种基于文件扩展名即文件名后缀的隐含规则。这种后缀规则定义了如何将一个具有特定文件名后缀的文件(例如.c文件),转换成为具有另一种文空盯件名后缀的文件(例如.o文件):

  .c:.o

  $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $1zap

  /usr/bin/make -dp | grep -v TIME>2zap

  diff 1zap 2zap

  rm 1zap 2zap

  lint: dosys.c donamc.c file.c main.c misc.c version.c gram.c

  $(LINT) dosys.c donamc.c file.c main.c misc.c version.c

  gram.c

  rm gram.c

  arch:

  ar uv /sys/source/s2/make.a $(FILES)

  通常在描述文件中应象上面一样定义要求输出将要执行的命令。在执行了 linux make命令之后,输出结果为:

  $ make

  cc -c version.c

  cc -c main.c

  cc -c donamc.c

  cc -c misc.c

  cc -c file.c

  cc -c dosys.c

  yacc gram.y

  mv y.tab.c gram.c

  cc -c gram.c

  cc version.o main.o donamc.o misc.o file.o dosys.o gram.o

  -LS -o make

+3348+3044=19580b=046174b

  最后的数字信息是执行”@size make”命令的输出结果。之所以只有输出结果而没有相应的命令行,是因为”@size make”命令以”@”起始,这个符号禁止打印输出它所在的命令行。

  描述文件中的最后几条命令行在维护编译信息方面非常有用。其中”print”命令行的作用是打印输出在执行过上次”make print”命令后所有改动过的文件名称。系统使用一个名为print的0字节文件来确定执行print命令的具体时间,而宏$?则指向那些在print 文件改动过之后进行修改的文件的文件名。如果想要指定执行print命令后,将输出结果送入某个指定的文件,那么就可修改P的宏定义:

  make print “P= cat>zap”

  在linux中大多数软件提供的是源代码,而不是现成的可执行文件,这就要求用户根据自己系统的实际情况和自身的需要来配置、编译源程序后,软件才能使用。只有掌握了make工具,才能让我们真正享受到到Linux这个自由软件世界的带给我们无穷乐趣。

linux .make的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux .make,如何使用Linux下的make命令?,linux 如何用make命令带参数详解,什么意思,在linux系统应用make命令时,makefile 与makefile有何区别的信息别忘了在本站进行查找喔。


数据运维技术 » 如何使用Linux下的make命令? (linux .make)