c++ - 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
我应该如何进行?
解决方案
编译器告诉您包含这些.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
. CC
并CFLAGS
用于构建 C 代码。
推荐阅读
- typescript - 为什么将 react-redux 与 typescript 一起使用时,连接的高阶组件中连接的包装组件的调度属性未定义?
- visual-studio - 直接从github打开vs项目时是否需要同步
- ios - 在线串行队列的多个定义,所以很困惑
- python-3.x - 最好在 Python 中使用项目或索引列表
- prolog - Prolog将n写为连续数字的总和
- regex - 正则表达式检查字符串是否除了两个特殊字符之间没有任何字母
- bash - 如果数组在变量中,则bash存储唯一值
- machine-learning - 当 Train 和 Test 线并行运行时,它表示什么?
- c# - 如何将此 C# 返回值序列化为 JSON 对象?
- odoo - Odoo search_default_product_id 通过在上下文中传递字符串