Makefile - 只制作两个库之一

Posted

技术标签:

【中文标题】Makefile - 只制作两个库之一【英文标题】:Makefile - Only Makes One of Two Libs 【发布时间】:2017-10-31 05:53:18 【问题描述】:

我是 makefile 的新手,正在尝试编译几个文件。

首先称为 s-chat,其他是 RWT(读写器)和 DP(餐饮哲学家)。他们都使用我的列表库,但 s-chat 需要使用 -m32 标志编译它。

这是我尝试做的:我使用 lib-adders.o、lib_movers.o、lib_removers.o 调用了一个 libMonitor.a。另一种是使用 lib_adders_32.o、lib_removers_32.o、lib_movers_32.o 的 liblist_32。出于某种原因,只制作了这两个库中的第一个,另一个说它找不到它的第一个依赖项。

PTHREADS  = /student/cmpt332/pthreads
RTT  = /student/cmpt332/rtt

CC       = gcc
CFLAGS   = -g
CPPFLAGS = -std=c90 -Wall -pedantic

.PHONEY: all clean

ARCH = $(shell uname -sm | tr -d ' ')

ifeq ($(ARCH),SunOS)
ARCH = $(PLATFORM)

PROCESSOR = "$(shell uname -p)"
ifeq ($(PROCESSOR),i386)
ARCH = i86pc
endif

endif

all: s-chat reader-writer-test dining-philosophers-test 

RWT_OBJS = reader-writer_$(ARCH).o reader-writer-monitor_$(ARCH).o Monitor_$(ARCH).o libMonitor_$(ARCH).a

reader-writer-test: CPPFLAGS += -I$(PTHREADS)
reader-writer-test: LDFLAGS += -L$(PTHREADS)/lib/$(ARCH)
reader-writer-test: LDLIBS += -lpthreads
reader-writer-test: $(RWT_OBJS)
    $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

reader-writer_$(ARCH).o: reader-writer.c reader_writer_monitor.h Monitor.h

reader-writer-monitor_$(ARCH).o: reader-writer-monitor.c reader_writer_monitor.h Monitor.h

DP_OBJS = dining-philosophers_$(ARCH).o dining-philosophers-monitor_$(ARCH).o Monitor_$(ARCH).o libMonitor_$(ARCH).a

dining-philosophers-test: CPPFLAGS += -I$(PTHREADS)
dining-philosophers-test: LDFLAGS += -L$(PTHREADS)/lib/$(ARCH)
dining-philosophers-test: LDLIBS += -lpthreads
dining-philosophers-test: $(DP_OBJS)
    $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

dining-philosophers_$(ARCH).o: dining-philosophers.c dining_philosophers_monitor.h Monitor.h

dining-philosophers-monitor_$(ARCH).o: dining-philosophers-monitor.c dining_philosophers_monitor.h Monitor.h

Monitor_$(ARCH).o: Monitor.c Monitor.h

list_adders.o: list_adders.c list.h
list_movers.o: list_movers.c list.h
list_removers.o: list_removers.c list.h

libMonitor_$(ARCH).a: list_adders.o list_movers.o list_removers.o
    ar rcs $@ $^


list_adders_32.o: CFLAGS += -m32
list_adders_32.o: LDFLAGS += -m32
list_adders_32.o: list_adders.c list.h
list_movers_32.o: CFLAGS += -m32
list_movers_32.o: LDFLAGS += -m32
list_movers_32.o: list_movers.c list.h
list_removers_32.o: CFLAGS += -m32
list_removers_32.o: LDFLAGS += -m32
list_removers_32.o: list_removers.c list.h

liblist_32_$(ARCH).a: list_adders_32.o list_movers_32.o list_removers_32.o
    ar rcs $@ $^

s-chat: CPPFLAGS += -I$(RTT)/include
s-chat: CFLAGS += -m32
s-chat: LDFLAGS += -L$(RTT)/lib/$(ARCH) -m32
s-chat: LDLIBS += -lRtt -lRttUtils
s-chat: s-chat.o liblist_32_$(ARCH).a
s-chat.o: s-chat.c

%_$(ARCH).o %_32_$(ARCH).o %.o %_32.o: %.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

%: %.o
    $(CC) $(LDFLAGS) $(LDLIBS) $^ -o $@

clean:
    rm -rf *.o *.a reader-writer-test dining-philosophers-test s-chat

这是我得到的错误:

ar rcs libMonitor_Linuxx86_64.a list_adders.o list_movers.o list_removers.o
ar: list_adders.o: No such file or directory
Makefile:66: recipe for target 'libMonitor_Linuxx86_64.a' failed
make: *** [libMonitor_Linuxx86_64.a] Error 1

如果我最后进行 s-chat,则生成 libMonitor,但我得到与 liblist_32 完全相同的错误,它说它找不到 list_adders_32.o

有人知道发生了什么以及如何解决这个问题吗?

提前致谢!!

【问题讨论】:

顺便说一句:.PHONY... 我不确定,但请尝试从此处的必要行中删除 .c 文件:list_adders.o: list_adders.c list.h => list_adders.o: list.h 【参考方案1】:

https://www.gnu.org/software/make/manual/make.html#Pattern-Intro

如果模式规则有多个目标,make 知道该规则的配方负责生成所有目标。该配方仅执行一次以生成所有目标。

%_$(ARCH).o %_32_$(ARCH).o %.o %_32.o: %.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

应该是这样的

%_$(ARCH).o: %.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

%_32_$(ARCH).o: %.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

%.o: %.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

%_32.o: %.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

但由于看起来你的所有源代码都在同一个目录中,你可以完全删除这些规则,因为 make 已经有一个用于 %.o: %.c 的内置规则。

【讨论】:

以上是关于Makefile - 只制作两个库之一的主要内容,如果未能解决你的问题,请参考以下文章

通过 makefile 链接文件

makefie文件的基本说明和使用

makefie文件的基本说明和使用

初识 makefile 的结构

重建后的Makefile重新编译代码需要很多时间

C开发编译与调试