[英]GNU Makefile - Generic Makefile for several targets
我目前正在开发一个带有小代码示例的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)
据我了解,该规则应采用所有目标文件并创建一个与目标文件同名的可执行文件,但我无法使其正常运行! 有没有人暗示如何实现这一目标?
解决方法如下:
在上面的示例中,我没有使用$(LDLIBS)变量,该变量由内置默认规则使用。 如果我将Makefile更改为使用$(LDLIBS)而不是$(LDFLAGS),一切都很好!
解决方案1 :(内置规则)
CC=gcc
CFLAGS=-g -fopenmp
LDFLAGS=
LDLIBS = -lstdc++ -lgomp
ECHO = echo
SILENT = @
MODULES = example1 example2 example3
all: $(MODULES)
clean:
$(SILENT) $(ECHO) "--- Removing object files and binaries ---"
$(SILENT) rm -f *.o
$(SILENT) rm -f $(MODULES)
.PHONY: clean
解决方案2 :(用户定义的规则)
CC=gcc
CFLAGS=-g -fopenmp
LDFLAGS=
LDLIBS = -lstdc++ -lgomp
ECHO = echo
SILENT = @
MODULES = example1 example2 example3
all: $(MODULES)
#disable built-in rule
%: %.cpp
#rule for *.cpp -> *.o
%.o: %.cpp
$(SILENT) $(ECHO) "--- Compiling $< ---"
$(SILENT) $(CC) -c $(CFLAGS) $(LDFLAGS) $<
#rule for object -> exectutable
%: %.o
$(SILENT) $(ECHO) "--- Linking $@ ---"
$(SILENT) $(CC) $^ $(LDLIBS) -o $@
clean:
$(SILENT) $(ECHO) "--- Removing object files and binaries ---"
$(SILENT) rm -f *.o
$(SILENT) rm -f $(MODULES)
.PHONY: clean
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.