尝试链接对象会使它们重新编译,即使是最新的

时间:2018-10-29 13:11:19

标签: makefile gnu-make

我的makefile文件中有一个食谱,该食谱依赖于几个目标文件。我希望将它们简单地链接起来,但是它们总是在重新编译。
我在Google上四处搜寻,发现了我不知道的信息(标有#)并进行了一些更改,但是问题仍然存在。

我被认为使make期望配方的名称是文件的名称,但我未能做到这一点。问题是我没有其他尝试解决此问题的方法。我将不胜感激

docker run -p 8500:8500 8501:8501 \
  --mount type=bind,source=/path/to/models/first/,target=/models/first \
  --mount type=bind,source=/path/to/models/second/,target=/models/second \
  --mount type=bind,source=/path/to/config/config.conf,target=/config/config.conf\
  -t tensorflow/serving --model_config_file=/config/config.conf

1 个答案:

答案 0 :(得分:1)

此规则不会创建它承诺的文件:

%.o: $(SOURCE_DIR)/%.cpp
    $(CC) -c $< $(INCLUDE_DIR) -o $(OUTPUT_DIR)/$@

看到-o $(OUTPUT_DIR)/$@吗?这指示编译器在$(OUTPUT_DIR)中而不是在工作目录中创建文件。

如果您确实希望将目标文件放入$(OUTPUT_DIR),则需要确保您的规则表明:

$(OUTPUT_DIR)/%.o: $(SOURCE_DIR)/%.cpp
    $(CC) -c $< $(INCLUDE_DIR) -o $@

或更佳的做法是像标准%.o: %.c规则(其中将包含CFLAGS等)

$(OUTPUT_DIR)/%.o: $(SOURCE_DIR)/%.cpp
    $(COMPILE.c) $(OUTPUT_OPTION) $<

我注意到您的输入文件被命名为*.cpp-通常,该约定适用于C ++文件(即使用$(COMPILE.cc)进行编译,它将调用$(CXX)而不是{{1} }。检查您是否没有混淆C和C ++源代码!