繁体   English   中英

困惑我的Makefile如何重新生成目标文件

[英]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 ++标志: CCCFLAGS变量用于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 $@ $^

请参阅Makefile中的默认链接器设置以链接C ++对象文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM