【发布时间】:2018-04-05 07:54:49
【问题描述】:
我有一个makefile,我在其中同时使用C 源代码和CPP 源代码。下面是来自 makefile 的一段 sn-p 代码。有没有办法结合以下两个目标来编译这两种文件类型?
#definitions
OBJ_DIR := obj
DEP_DIR := dep
CXX := g++
DEBUG := -g -O0
OPT := -std=c++11 -Wextra -Wall -pthread
LFLAGS = $(DEBUG) $(OPT) $(INC)
CFLAGS = $(LFLAGS) -c
#auto-dependency generation (part 1)
DEP_FLAGS = -MT $@ -MMD -MP -MF $(DEP_DIR)/$*.Td
POSTCOMPILE = @mv -f $(DEP_DIR)/$*.Td $(DEP_DIR)/$*.d && touch $@
#compile object files from CPP source
$(OBJ_DIR)/%.o: %.cpp $(DEP_DIR)/%.d
$(CXX) $(CFLAGS) $(DEP_FLAGS) $< -o $@
$(POSTCOMPILE)
#compile object files from C source
$(OBJ_DIR)/%.o: %.c $(DEP_DIR)/%.d
$(CXX) $(CFLAGS) $(DEP_FLAGS) $< -o $@
$(POSTCOMPILE)
#auto-dependency generation (part 2)
$(DEP_DIR)/%.d: ;
.PRECIOUS: $(DEP_DIR)/%.d
include $(wildcard $(DEP_DIR)/*.d)
我曾尝试通过二次扩展来使用具有各种不同格式的通配符功能,但无济于事。
我正在使用 Make 4.2。自动依赖生成代码取自http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/。
提前致谢
【问题讨论】:
-
CFLAGS包含特定于 C++ 的标志,通常用于 C 源代码。CXXFLAGS是标准 C++ 标志变量。您通常还应该使用$(CC)作为 C 编译器。 -
使用明确的规则来构建以
.c或.cpp作为源的目标文件可能不是一个好主意。 Make 已经内置了这些。只需在CFLAGS(.c-files)和CXXFLAGS(.cpp-files)中指定您需要的标志。大多数你定义的变量,你真的不应该。它不可能为用户覆盖那些 - 只附加到CFLAGS和CXXFLAGS变量并且根本不定义CXX。 -
@Someprogrammerdude 不是
CFLAGS特定于 C 而不是 C++? -
@KamiKaze 我的意思是说
CFLAGS中显示的Makefile包含C++ 编译器特定的标志。因此,不应将其用于当前Makefile中的 C 源代码(这是CFLAGS的用途)。 -
这是可能的(使用
defines和evals等),但最终结果比有两个规则更混乱。这是几天前讨论过的here(阅读cmets)。