我具有以下目录和文件结构:
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
我应该如何进行?
答案 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
文件。
通常,CXX
与CXXFLAGS
一起用于C ++编译器。 CC
和CFLAGS
用于构建C代码。