首页 > 解决方案 > Makefile 不会将 .o 文件放在构建文件夹中

问题描述

问题

我有以下目录和文件结构:

Makefile
main.cpp
|source
|-A.cpp
|-B.cpp
|-Linker.h
|build

每个文件都有这个结构

主文件

//main.cpp
#include "source/Linker.h"

int main(){
    A(...)
    B(...)
}

链接器.h

//Linker.h
void A
void B

A.cpp B.cpp 各自定义了一个特定的函数。

我喜欢做的是,使用构建这个结构Makefile并将所有.o文件放在build目录中。


我试过的

所以我做了以下事情Makefile

CC = g++ -std=c++11
CFLAGS = -c -Wall

OBJS = ./build/main.o ./build/A.o ./build/B.o 
OUT  = Project

all: Project

Project: $(OBJS)
    $(CC) $(OBJS) -o Project

./build/main.o: main.cpp
    $(CC) $(CFLAGS) main.cpp

./build/A.o: ./source/A.cpp
    $(CC) $(CFLAGS) ./source/A.cpp

./build/B.o: ./source/B.cpp
    $(CC) $(CFLAGS) ./source/B.cpp

错误

但这会产生.o顶级目录中的所有文件,并出现以下错误:

g++: error: ./build/main.o: No such file or directory
g++: error: ./build/A.o: No such file or directory
g++: error: ./build/B.o: No such file or directory

我应该如何进行?

标签: c++makefile

解决方案


编译器告诉您包含这些.o文件的输出目录不存在。

解决方法是使目标依赖于它们的目录并明确指定输出文件(使用-o $@):

Project: $(OBJS)
    $(CC) -o $@ $(OBJS) 

build/%.o: %.cpp | build
    $(CC) -o $@ $(CFLAGS) $<

build/%.o: source/%.cpp | build
    $(CC) -o $@ $(CFLAGS) $<

build:
    mkdir $@

请注意,以上使用一种模式规则来构建所有.o文件。


通常,CXX用于 C++ 编译器以及CXXFLAGS. CCCFLAGS用于构建 C 代码。


推荐阅读