我有一个如下所示的 makefile:
CS := a.c b.c
CPPS := foo.cpp bar.cpp
SOURCES := $(CS) $(CPPS)
OBJS := $(CS:%.c=$(OBJSDIR)/%.o) $(CPPS:%.cpp=$(OBJSDIR)/%.o)
我想创建一个规则来编译它们。但我能想到的唯一选择是:
$(OBJSDIR)/%.o: %.cpp
$(GXX) $(GXXFLAGS) -c $< -o $@
但是它当然不起作用,因为某些目标文件没有匹配的 C++ 源文件。
有什么想法吗?
最佳答案
假设你有 a.cc、b.cc 和 c.cc,另一边有 d.c、e.c 和 f.c
program_objs = a.o b.o c.o d.o e.o f.o
program: $(program_objs)
$(CC) $(LDFLAGS) -o $@ $(program_objs)
您不需要更多的东西,因为 make 会自动检测哪些文件是 c++ 文件,哪些文件是纯 c 文件,并选择正确的编译器。
如果您想要一些特殊的东西,而不包含在 makefile 中,您可以使用以下规则添加一些后缀(文件类型):
.SUFFIXES: .a .b .o
然后使用以下规则将它们编译为.o
.a.o:
$(COMPILER_A) $(COMPILER_A_FLAGS) -c $@ -o $<
.b.o:
$(COMPILER_B) $(COMPILER_B_FLAGS) -c $@ -o $<
并让 makefile 选择正确的编译器(存储在变量 COMPILER_A 或 COMPILER_B 中的编译器)来完成这项工作。
当然,您可以使用明确的规则将某些内容编译到 .o 文件,如下所示:
a.o: a.cc
g++ -o a.o -c a.cc
b.o: b.cc
g++ -o b.o -c b.cc
c.o: c.cc
g++ -o c.o -c c.cc
d.o: d.c
gcc -o d.o -c d.c
e.o: e.c
gcc -o e.o -c e.c
f.o: f.c
gcc -o f.o -c f.c
注意#1:
已经对 GNU make % 模式提出了一些建议,以构建目标的隐式规则。下面是对上面隐式规则的重写,以执行相同的操作:
%.o: %.a
$(COMPILER_A) $(COMPILER_A_FLAGS) -c $@ -o $<
%.o: %.b
$(COMPILER_B) $(COMPILER_B_FLAGS) -c $@ -o $<
一如既往,$@
表示规则的目标,$<
(您也可以使用 $*
作为文件名,没有任何匹配的后缀)左侧所需的文件。有关可以使用的自动变量的完整列表,我建议您阅读 make 手册。考虑到旧后缀语法与新后缀语法相反(目标后缀出现在旧语法的最后,新语法更类似于目标位于冒号左侧的普通 makefile 规则)
关于linux - 在一个 makefile 中编译 C++ 和 C 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27051066/