[英]Confused how my Makefile is remaking object files
尝试重新制作目标文件时,我的制作文件无法找到我的包含目录。 例如,当我调用make tests
我得到输出:
g++ -c -o sdl_class.o sdl_class.cpp
sdl_class.cpp:9:23: fatal error: sdl_class.h: No such file or directory
#include <sdl_class.h>
^
compilation terminated.
make: *** [sdl_class.o] Error 1
我的Makefile是这样的:
#Originally from: http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/
#But will be heavily modified
IDIR =../include
CC=g++
CFLAGS=-w -I$(IDIR)
#ODIR=obj
LDIR =../lib
LIBS=-lSDL2
_DEPS = sdl_class.h SDL_image.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
OBJ = sdl_class.o tests.o
#OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
%.o: %.cpp $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS) $(LIBS)
tests: sdl_class.o tests.o
$(CC) -o $@ $^ $(CFLAGS) $(LIBS)
all: $(OBJ)
$(CC) -o $@ $^ $(CFLAGS) $(LIBS)
.PHONY: clean
clean:
rm -f *.o *~ core $(IDIR)/*~
我的理解是,当我调用make tests
时,它应该尝试重新制作sdl_class.o文件。 然后,应调用%.o
规则,该规则应尝试通过调用以下命令来制作目标文件:
g++ -c -o sdl_class.o sdl_class.cpp -w -I../include -lSDL2
但是,情况并非如此,因为看起来就像在调用$(CC) -c -o $@ $< $(CFLAGS) $(LIBS)
,您可以从上面看到。
我对make如何建立规则有基本的误解吗? 似乎这是我的第一个Makefile。 也许我对编译的总体工作方式感到困惑,因为我对此还是有些陌生。
我要说的问题是,一个或多个文件../include/sdl_class.h
或../include/SDL_image.h
不存在。 因此,make决定您的模式规则不匹配(因为无法找到或满足所有先决条件),并且默认情况下使用内置规则从.cpp
文件创建目标文件。
内置规则将make变量CXX
用于C ++编译器,将CXXFLAGS
用于C ++标志: CC
和CFLAGS
变量用于C编译器。 因此,您对CFLAGS
的设置将被忽略。
如果运行make -d sdl_class.o
您将看到make正在寻找哪个文件以及为什么它决定不使用模式规则。
如果您这样重写规则,则效果会更好:
%.o: %.cpp
$(CC) -c -o $@ $< $(CFLAGS)
sdl_class.o tests.o: $(DEPS)
因为make现在会抱怨找不到或创建相关文件。
当然,还有其他问题。 您不应该将$(LIBS)
传递给编译命令。 仅属于您的链接行。 并且,对于C ++编译器,您可能应该坚持使用标准变量CXX
,对于-I
和-D
类的预处理器标志,应使用CPPFLAGS
;对于C ++编译器标志,则应CPPFLAGS
CXXFLAGS
。 同样,链接库标志(如-L../lib
位于LDFLAGS
,而链接库标志如-lSDL2
则位于LDLIBS
。
CC / CCFLAGS用于C编译。 您应该将CXX和CXXFLAGS用于C ++。 它们用在内置规则和LINK.cc宏中,使Makefile更加简单,从而减少了出错的可能性。
CXXFLAGS = -Wall ...
prog : foo.o bar.o
$(LINK.cc) -o $@ $^
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.