如何编写.c和cpp文件共有的配方

时间:2014-08-01 10:57:17

标签: makefile gnu prerequisites

我想使用相同的编译器命令(如

)编译.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文件?

1 个答案:

答案 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 ++源文件的内置规则。正确使用上述变量,根本不需要指定这些通用规则。