gpt4 book ai didi

c++ - 仅重新编译更改的文件(两步)

转载 作者:行者123 更新时间:2023-11-30 05:08:58 25 4
gpt4 key购买 nike

我在这里阅读了几个关于 SO 的问题,但我的 Makefile 仍然无法执行我想要的操作。与其他问题相反,我这里有一个两步编译。步骤如下:

  • 使用预处理器工具(称为 ppx)生成 .cpp.h 文件,
  • 然后编译生成.o文件,
  • 最后创建一个动态库。

所有这些都在 Xcode 环境(自定义构建目标)中,因此您可以看到所有这些 $(TARGET_TEMP_DIR) 和类似的变量。

make 命令在 ppx 文件所在的位置被调用,但我需要将所有生成的文件 (.cpp.h.o.dylib)在正确的目录中(参见 $(LIB)).

注意:ppx 工具不保留时间戳

这是我失败的尝试:

# target and compiler
LIB=$(TARGET_TEMP_DIR)/$(TARGET_NAME).dylib
PPX=$(HOME)/bin/ppx

# c++ compiler
CXXFLAGS=-std=c++14

# files
PPX_FILES := $(patsubst %.ppx, %.cpp, $(wildcard *.ppx))
CPP_FILES := $(patsubst %.ppx, %.o, $(wildcard *.ppx))
OBJ_FILES := $(addprefix $(TARGET_TEMP_DIR)/,$(CPP_FILES:%.cpp=%.o))

# link library
all: $(LIB)

$(LIB): $(PPX_FILES) $(CPP_FILES) $(OBJ_FILES)
$(CXX) -dynamiclib -o $(LIB) $(OBJ_FILES)

# preprocess, generating source and header
%.cpp: %.ppx
$(PPX) -o $(TARGET_TEMP_DIR) $<

# compile cpp source files
%.o: %.cpp
$(CXX) $(CXXFLAGS) -Ofast -o $(TARGET_TEMP_DIR)/$@ -c $(TARGET_TEMP_DIR)/$<

上面的Makefile 总是重新编译所有文件。在阅读了我在这里发现的所有问题之后,我唯一成功的就是拥有一个永不重新编译的 Makefile,这样当我更改 ppx 文件时它什么也没做。

你能帮我找出错误吗?

最佳答案

第 1 步:foo.ppx 构造 foo.cppfoo.h,并将它们放入在正确的目录中。 (我理解你的意思是“正确的目录”是 $(TARGET_TEMP_DIR),但你有点含糊。)

# preprocess, generating source and header
$(TARGET_TEMP_DIR)/%.cpp: %.ppx
$(PPX) -o $(TARGET_TEMP_DIR) $<

或更好:

# preprocess, generating source and header
$(TARGET_TEMP_DIR)/%.cpp: %.ppx
$(PPX) -o $(dir $@) $<

第 2 步:foo.cppfoo.h 构造 foo.o(和 bar.hbaz.h,根据需要。我建议你接下来研究一下自动依赖处理。)

# compile cpp source files
%.o: %.cpp
$(CXX) $(CXXFLAGS) -Ofast -o $@ -c $<

第 3 步:构建所需目标文件的列表,并使用合理的名称:

# files                                     
PPX_FILES := $(wildcard *.ppx)
OBJ_FILES := $(patsubst %.ppx, $(TARGET_TEMP_DIR)/%.o, $(PPX_FILES))

第 4 步: 构建库:

$(LIB): $(OBJ_FILES)
$(CXX) -dynamiclib -o $@ $^

如果由于时间戳和 ppx(我不必试验)问题仍然无法正常工作,请在评论中告诉我们;我很确定修复很容易。

关于c++ - 仅重新编译更改的文件(两步),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46448109/

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