Makefile不会将.o文件放在生成文件夹中

时间:2019-03-18 10:24:32

标签: c++ makefile

问题

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

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

每个文件都具有这种结构

main.cpp

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

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

Linker.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

我应该如何进行?

1 个答案:

答案 0 :(得分:6)

编译器会告诉您,带有那些.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文件。


通常,CXXCXXFLAGS一起用于C ++编译器。 CCCFLAGS用于构建C代码。

相关问题