【发布时间】:2017-09-28 01:51:51
【问题描述】:
我在这里阅读了几个关于 SO 的问题,但我的 Makefile 仍然不会做我想做的事。与其他问题相反,我在这里有一个两步编译。步骤如下:
- 使用生成
.cpp和.h文件的预处理器工具(称为ppx), - 然后编译它们生成
.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 文件时它什么也没做。
你能帮我找出错误吗?
【问题讨论】:
-
您的变量
PPX_FILES和CPP_FILES具有误导性,因为PPX_FILES列出了C++ 源文件,而CPP_FILES列出了目标文件。您也不需要从磁盘中获取每个变量的文件名,只需替换第一个变量的后缀即可。 -
您的 ppx 工具是否会重新生成未更改的文件?他们的时间戳会改变吗?
-
@RetiredNinja 是的,确实如此。我正在尝试使用
make来避免这种情况。 -
@Someprogrammerdude 我知道,但我不太熟悉
make以获得清晰的文件列表。 -
你到底是什么意思,
ppx不保留时间戳?gcc -c也没有。这就是make规则的意义所在;如果输出时间戳是最新的,甚至不会调用工具。如果它们已过时,则时间戳不应在生成新的输出文件时保留
标签: c++ makefile timestamp preprocessor