linux - 在一个 makefile 中编译 C++ 和 C 文件

标签 linux unix gcc compilation makefile

我有一个如下所示的 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/

相关文章:

linux - 'set -- $REPLY' 是做什么的?

unix - awk/Unix group by

linux - 有人用 Mono 成功实现了 OpenID 吗?

python - Flask 应用程序退出时如何停止 Gunicorn

c - waitpid 与 WUNTRACED

linux - 在 Ubuntu 终端中禁用自动换行

php - 无法连接到本地套接字,连接被拒绝

c - 使用 gcc 编译时出错

objective-c - 无法使用 GNUStep 编译 objective-c 应用程序

c++ - 前向声明文件 *