【发布时间】:2014-12-12 10:50:12
【问题描述】:
我目前正在开发一个带有小代码示例的小 C++ 包,用于教学目的。我设法编写了一个像下面这样的 Makefile,它将所有 *.cpp 文件编译为 *.o 文件并将它们链接到可执行文件:
CC=gcc
CFLAGS=-g
LDFLAGS= -lstdc++
ECHO = echo
SILENT = @
MODULES = example1 example2 example3
all: $(MODULES)
#a generic rule to create .o files from .cpp files (e.g. example1.cpp -> example1.o)
%.o: %.cpp
$(SILENT) $(ECHO) "--- Compiling $< ---"
$(SILENT) $(CC) -c $(CFLAGS) $<
#define targets and their dependencies
example1: example1.o
$(SILENT) $(ECHO) "--- Linking $@ ---"
$(SILENT) $(CC) $^ -o $@ $(LDFLAGS)
example2: example2.o
$(SILENT) $(ECHO) "--- Linking $@ ---"
$(SILENT) $(CC) $^ -o $@ $(LDFLAGS)
example3: example3.o
$(SILENT) $(ECHO) "--- Linking $@ ---"
$(SILENT) $(CC) $^ -o $@ $(LDFLAGS)
clean:
$(SILENT) $(ECHO) "--- Removing object files and binaries ---"
$(SILENT) rm -f *.o
$(SILENT) rm -f $(MODULES)
.PHONY: clean
到目前为止一切顺利,效果很好。它将使用 example1.cpp、example2.cpp 和 example3.cpp 并将其编译/链接到 3 个可执行文件“example1 example2 example3”。
但是由于每个可执行文件都与对象具有相同的名称(例如“example1.o”将链接到可执行文件“example1”),我想知道是否还有一种方法可以使用通用规则。
我尝试了几种方法,例如:
%: %.o
$(SILENT) $(ECHO) "--- Linking $@ ---"
$(SILENT) $(CC) $^ -o $@ $(LDFLAGS)
据我了解,这条规则应该采用所有目标文件并创建一个与目标文件同名的可执行文件,但我无法让它工作!有没有人提示如何实现这一目标?
【问题讨论】:
-
那么当你这样做时出了什么问题?
标签: c++ makefile rules targets