linux下的make

    xiaoxiao2021-03-25  128

    在Linux下写写简单的程序可以使用gcc/g++进行编译,若涉及的.c文件太多,则使用起来太麻烦,容易出错,且灵活性不高。

    如:涉及文件有hello.c add.c等等

    编译:gcc -o hello hello.c(未包含add.c文件)

    gcc -o hello.o -c hello.c

    gcc -o add.o -c add.c

    gcc -o hello hello.o add.o(才可)

    只是多了一个add.c文件,要是包含更多.c文件光是写命令就要耗费大量的时间。开发效率及其的低。

    make 是一种能够控制编译或者重复编译软件的工具。

    makefile是一个文本形式的脚本文件,其中包含一些规则告诉make编译哪些文件,怎样编译以及在什么条件下编译。

    makefile规则遵循以下通用形式

    target:dependency[dependency[...]]

               command

               command

               ......

    每一个command的第一字符前面必须加上tab键。

    举例说明:

    最简单的形式

    vi makefile

    strat:hello.o

            gcc -o hello hello.o

    hello.o:

            gcc -o hello.o hello.c

    解析:start代表标号,hello.o代表依赖项,执行第一个标号,看是否有依赖项,若有则寻找此依赖项的标号,找到后即执行命令语句。(命令行输入make即可)

    进一步完善makefile文件

    start:hello.o

            gcc -o hello hello.o

            @echo '----------ok-----------'

    hello.o

            gcc -o hello.o hello.c

    clean:

            rm -f hello.o

    解析:多加一个标号,可以通过命令行输入make clean,再调用此命令行。增加了@echo显示编译成功语句,为了将语句本身输出,加上@符号可以不输出命令。

    更简单的使用makefile

    在makefile中使用变量通过替换依赖项来完成。把变量用括号括起来,前面加上$就可以引用该变量的值,如$(varname),按习惯makefile的变量都是大写。

    如:

    CC = gcc

    SRCS = hello.c

    OBJS = hello.o

    EXEC = hello

    start:$(OBJS)

            $(CC) -o $(EXEC) $(OBJS)

    OBJS:

           $(CC) -o $(OBJS) -c $(SRCS)

    clean:

            rm -f $(OBJS)

    通过使用.SUFFIXES:.c .o(告诉make代表.c和.o之间有关系)若写的是.CPP文件时,应在将.c换成.cpp

    如:

    OBJS = $(>SUFFIXES:.c = .o)

    $@   常规的目标所对应的文件名(依赖项)

    $<     规则中的第一个相关的文件名(被依赖项)  

    如:

    .SUFFIXES:.c .o                                                        若写的是.CPP文件时,应在将.c换成.cpp

    CC = gcc

    SRCS = hello.c

    OBJS = $(SRCS:.c = .o)                                             若写的是.CPP文件时,应在将.c换成.cpp

    EXEC = hello

    start:$(OBJS)

            $(CC) -o $(EXEC) $(OBJS)

    .c.o:                                                                                若写的是.CPP文件时,应在将.c换成.cpp

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

    clean:

            rm -f $(OBJS)

    在makefile文件中同时编译多和源文件

    如:hello.c add.c

    即:

    .SUFFIXES:.c .o                                                            若写的是.CPP文件时,应在将.c换成.cpp

    CC = gcc

    SRCS = hello.c\

                     add.c

    OBJS = $(SRCS:.c = .o)                                              若写的是.CPP文件时,应在将.c换成.cpp

    EXEC = hello

    start:$(OBJS)

            $(CC) -o $(EXEC) $(OBJS)

            @echo '----------ok-----------'

    -c.o:                                                                                若写的是.CPP文件时,应在将.c换成.cpp

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

    clean:

            rm -f $(OBJS)

           

    转载请注明原文地址: https://ju.6miu.com/read-9600.html

    最新回复(0)