我在这里已经阅读了几个问题,但我的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
文件时它什么也没做。
你能帮我发现错误吗?
答案 0 :(得分:1)
第1步:从foo.cpp
构建foo.h
和foo.ppx
,并将它们放在正确的目录中。 (我理解你的意思是“正确的目录”是$(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.o
和foo.cpp
(以及foo.h
和bar.h
构建baz.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(我不需要进行实验)问题仍然出现故障,请在评论中告诉我们;我很确定修复很容易。