makefile文件解释

makefile文件解释

makefile文件

CC = g++

PROGRAM = ubuntuopengl

SRC = $(wildcard ./*.cpp)

OBJECTS = $(patsubst %.cpp,%.o,$(SRC))

LIBS = -lX11 -lGL -lGLEW

%.o: %.cpp
 $(CC) $(LIBS) -c -o $@ $< 

$(PROGRAM): $(OBJECTS)
 $(CC) -o $@ $(OBJECTS) $(LIBS)
 
clean:
 -rm -f $(PROGRAM)
 -rm -f $(OBJECTS)

详细解释

目标:通常是要产生的文件的名称,它可以是可执行文件(OBJ文件),也可是一个执行的动作名称,如‘clean’。
依赖:用来输入从而产生目标的文件,一个目标经常有几个依赖。
命令:Make执行的动作,一个规则可以含有几个命令,每个命令占一行。
注意:每个命令行前面必须是一个Tab字符,即命令行第一个字符是Tab。
指令

$(var)

$(var) 变量引用

CC = g++

CC:makefile隐含变量,默认选择gcc编译器,这边使用g++

PROGRAM = ubuntuopengl

PROGRAM = ubuntuopengl 给最后输出文件起别名

SRC = $(wildcard ./*.cpp)

SRC = $(wildcard ./*.cpp) 获取工作目录下的所有的.cpp文件(源文件)列表

INCLUDES = XXX

.h文件(头文件)所在位置

OBJECTS = $ (patsubst %.cpp,%.o,$(SRC))

$ (patsubst 原模式, 目标模式, 文件列表) 在$ (patsubst %.c,%.o,$ (SRC) )中,patsubst把$(SRC)中的变量符合后缀是.cpp的全部替换成.o

LIBS = -lX11 -lGL -lGLEW

LIBS = -lX11 -lGL -lGLEW 库文件

DEFS = -DPR_OPENGL

宏定义预处理 只在预处理阶段起作用

%.o: %.cpp
$(CC) $(LIBS) -c -o $@ $<

静态模式 生成链接文件

解释什么是静态模式:

objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
等同于
foo.o : foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o : bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o

试想,如果我们的%.o有几百个,那种我们只要用这种很简单的“静态模式规则”就可以写完一堆规则,实在是太有效率了

$(PROGRAM): $(OBJECTS)
$(CC) -o $@ $(OBJECTS) $(LIBS)

链接库文件生成可执行文件

clean:
-rm -f $(PROGRAM)
-rm -f $(OBJECTS)

清理可执行文件和生成的.o文件

此外常用的一些指令

CFLAGS

CFLAGS:指定头文件(.h)的路径 如:CFLAGS=-I /usr/include -I /path/include

LDFLAGS

LDFLAGS:指定库文件的路径 如:LDFLAGS=-L /usr/lib -L /path/to/your/lib

LIBS

LIBS:告诉链接器要链接哪些库文件。如LIBS = -lx11 -lGL -lGLEW, -l代表所链接的库文件

-shared

在 Makefile 中使用"-shared"选项时,将创建一个共享库文件而不是可执行文件

-fPIC

选项允许编译器生成与位置无关的代码,使编译生成的代码可以在内存中的任何位置加载,并且特别适用于生成共享库文件

猜你喜欢

转载自blog.csdn.net/weixin_44478077/article/details/128686479