【问题标题】:g++ makefile error: *.o: No such file or directory [duplicate]g ++ makefile错误:* .o:没有这样的文件或目录[重复]
【发布时间】:2018-02-26 22:46:41
【问题描述】:

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

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

【问题讨论】:

    标签: c++ makefile g++


    【解决方案1】:

    目标名称 ($(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 $<
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 2016-01-10
      相关资源
      最近更新 更多