g ++ makefile错误:* .o:没有这样的文件或目录

时间:2018-02-26 22:46:42

标签: c++ makefile g++

我有一个像这样的项目的文件结构:

Project Folder
|
->source
    |
    -->main.cpp
    -->frac.hpp
    -->frac.cpp
-> obj
    |Empty for now, but will store the .o files

这是我的makefile:

CC = g++
CFLAGS = --std=c++11 -Wall
LFLAGS = --std=c++11
SRC = source
OBJ = obj

all: frac

frac: $(OBJ)/main.o $(OBJ)/frac.o
    g++ $(LFLAGS) -o frac $(OBJ)/main.o $(OBJ)/frac.o

$(OBJ)/main.o: $(SRC)/main.cpp $(SRC)/frac.hpp
    g++ $(CFLAGS) -c $(SRC)/main.cpp

$(OBJ)/frac.o: $(SRC)/frac.cpp $(SRC)/frac.hpp
    g++ $(CFLAGS) -c $(SRC)/frac.cpp

现在,当我运行命令make frac

我收到这些错误:

g++ --std=c++11 -o frac obj/main.o obj/frac.o
g++: error: obj/main.o: No such file or directory
g++: error: obj/frac.o: No such file or directory
g++: fatal error: no input files
compilation terminated.
make: *** [frac] Error 4

现在对我来说这个奇怪的部分是,在这些错误之后,它仍会在当前目录中生成main.o和frac.o。然后我必须做mv * .o obj将它们全部移动到obj目录中。然后我可以运行make frac,这次它可以工作并生成可执行文件。我知道make正在尝试使用不存在的链接文件,那么如何通过第一次运行命令生成它们呢?

谢谢!

编辑:我看过这个帖子How to place object files in separate subdirectory 但我不清楚如何实施该解决方案。我不能直接将粘贴复制到我的makefile中,并且他的结构与我的结构不同

1 个答案:

答案 0 :(得分:2)

目标名称($(OBJ)/main.o)告诉生成期望的内容,但它并没有告诉编译器构建什么。 {{ 1}} flag将告诉g ++将它构建的文件放在何处。所以改变这些:

-o

到这些:

$(OBJ)/main.o: $(SRC)/main.cpp $(SRC)/frac.hpp
    g++ $(CFLAGS) -c $(SRC)/main.cpp

$(OBJ)/frac.o: $(SRC)/frac.cpp $(SRC)/frac.hpp
    g++ $(CFLAGS) -c $(SRC)/frac.cpp

然后您可以使用另一个自动变量来简化这些规则:

$(OBJ)/main.o: $(SRC)/main.cpp $(SRC)/frac.hpp
    g++ $(CFLAGS) -o $@ -c $(SRC)/main.cpp

$(OBJ)/frac.o: $(SRC)/frac.cpp $(SRC)/frac.hpp
    g++ $(CFLAGS) -o $@ -c $(SRC)/frac.cpp

然后,如果您愿意,由于这些规则非常相似,您可以将它们组合成静态模式规则:

$(OBJ)/main.o: $(SRC)/main.cpp $(SRC)/frac.hpp
    g++ $(CFLAGS) -o $@ -c $<

$(OBJ)/frac.o: $(SRC)/frac.cpp $(SRC)/frac.hpp
    g++ $(CFLAGS) -o $@ -c $<