gpt4 book ai didi

c++ - C/C++ Makefile : How to build dependencies between with . c文件和其他目录下的目标文件?

转载 作者:太空宇宙 更新时间:2023-11-04 11:27:24 25 4
gpt4 key购买 nike

这是我的 .c 和 .o 文件层次结构:

---/src/IRBuild/main.c
func1.c
func2.c
---/inclue/main.h
func1.h
func2.h

---/build/IRBuild/main.o
func1.o
func2.o
irbuild

下面是我在 ~/src/IRBuild/下的 Makefile,我用 .c 和 .h 文件构建了编译依赖,这意味着每当 .c 或 .h 文件被更改时。 “make”将重建目标文件。但是因为我将 .o 文件输出到 ~/build/IRBuild/,而不是当前目录,“make”将在我每次 make 时重建所有 .o 文件。

我应该如何与其他目录中的 .o 文件建立依赖关系?仅在 .c、.h 或 .o 文件更改时才重新编译特定文件?

卡在这里两天,非常感谢!

   EXE=irbuild

# G++ as default compiler
CC=g++

# Compile time flags
CXXFLAGS = -g -Wall

# Library paths in addition to /usr/lib
LFLAGS=-std=c++0x

# Libraries to link into executable:
#LIBS = -lmylib -lm

# Include files directory other than /usr/include
INCLUDES=-I../../include/

SRC=$(wildcard *.cpp)
OBJ=$(SRC:.cpp=.o)
DEP=$(OBJ:.o=.d)
BUILD=../../build/IRBuild
TESTS=../../tests/

OBJS :=$(foreach obj, $(OBJ), $(BUILD)/$(obj))

.PHONY: depend clean

all: $(EXE)
cp $(EXE) $(TESTS)
$(EXE): $(OBJ)
$(CC) $(CXXFLAGS) $(LFLAGS) $(INCLUDES) -o $(EXE) $(OBJS)

.cpp.o:
$(CC) $(CXXFLAGS) $(LFLAGS) $(INCLUDES) -c $< -o $(BUILD)/$@

clean:
rm -f $(OBJS) $(DEP) $(EXE)

depend: .depend
.depend: $(SRC)
rm -f ./.depend
$(CC) $(CXXFLAGS) $(LFLAGS) $(INCLUDES) -MM $^ -MF ./.depend;
include .depend

最佳答案

您违反了 http://make.mad-scientist.net/rules.html 中的规则 2,这就是为什么它认为它们不存在时一直重建它们的原因。 (在先决条件中列出 $(OBJ) 并在配方链接行中列出 $(OBJS) 也有点像 makefile 的“味道”。)

您需要使用从目标文件正确映射到其先决条件的规则。

手动或使用 vpath

有多种方法可以使手动方法发挥作用,具体取决于您要投入多少精力进行设置。 vpath 方法可能会简单一些。

使用 vpath 应该只需要使用 $(OBJS) 作为 $(EXE) prereqs,然后添加 vpath %。 cpp .vpath %.h ../../include 或类似的东西。

关于c++ - C/C++ Makefile : How to build dependencies between with . c文件和其他目录下的目标文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26153214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com