我想使用相同的编译器命令(如
)编译.c
和.cpp
文件
CC=g++
...
OBJS=mora.o
all : $(OBJS) libMO.so
%.o: %.c
$(CC) $(INCLUDES) $(CCFLAGS) -c $(<) -o $(@)
libMO.so: $(OBJS)
$(CC) $(LDFLAGS) $(CCFLAGS) $(^) -o $(@)
现在问题是如何包含.cpp
文件的规则/配方?我们可以使用regex for prerequiste在同一规则中执行此操作吗?
是否可以为.cpp
再写一个规则/配方?
%.o: %.c
$(CC) $(INCLUDES) $(CCFLAGS) -c $(<) -o $(@)
%.o: %.cpp
$(CC) $(INCLUDES) $(CCFLAGS) -c $(<) -o $(@)
上述第一个配方是否会为.cpp
文件提供错误,因为它找不到对应的.c
文件?
答案 0 :(得分:1)
是否可以为
.cpp
再写一个规则/配方?
是的。您可以为要处理的每个扩展编写规则。如果您重新定义相同的模式,make will choose the first one found in the makefile。
上述第一个配方是否会为
.cpp
文件提供错误,因为它找不到相应的.c
文件?
Make将独立于.cpp
文件处理.c
个文件,反之亦然(除非您明确告诉他不要,例如.c
文件是否取决于.cpp
文件)。
那说,一点评论:
$(<)
或$(@)
等特殊变量不需要括号。您可以直接撰写$<
和$@
。
C和C ++规则共享相同的内置$(CPPFLAGS)
变量(用于预处理程序标志,您的$(INCLUDE)
变量内容应该进入)。
C使用$(CC)
和$(CFLAGS)
内置变量:
CC = $(CXX)
...
%.o: %.c
$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
C ++使用$(CXX)
和$(CXXFLAGS)
内置变量:
%.o: %.cpp
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@
GNU Make已经有C和C ++源文件的内置规则。正确使用上述变量,根本不需要指定这些通用规则。