c++ - g++ makefile 错误 : *. o: 没有那个文件或目录

标签 c++ makefile g++

<分区>

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

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

这是我的生成文件:

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 中,而且他的结构与我的不同

最佳答案

目标名称 ($(OBJ)/main.o) 告诉 Make 期望什么, 但它不告诉编译器要构建什么. -o 标志将告诉 g++ 将其构建的文件放在哪里。所以改变这些:

$(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 $<

然后,如果你愿意,因为这些规则非常相似,你可以将它们组合成一个静态模式规则:

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

关于c++ - g++ makefile 错误 : *. o: 没有那个文件或目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48998343/

相关文章:

c++ - 用于在 header 更改时重新编译的简单 C 项目的示例 makefile

makefile 缺少分隔符

c++ - 错误: 'unordered_set' is not a member of 'std'

c++ - 使用 g++ 链接时出现错误

c++ - decltype(..., void()) 和 void_t 的区别

c# - 如何在 C# 中将数据从指针复制到指针?

c++ - makefile 中 CXX 的值从何而来?

c++ - 用mingw编译opencv3.1

c++ - 使用 MinGW 编译 SFML 项目

c++ - 使用 Visual C++ 构建时如何使用 SSE(以及 SSE2、SSE3 等)扩展?