我有一个像这样的项目的文件结构:
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中,并且他的结构与我的结构不同答案 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 $<