每个人,我有这段代码,而且我也有错误:
CC = gcc
SRCS_L = a.c b.c c.c d.c
OBJS_L = a.o b.o c.o d.o
SRCS_R = x.c y.c
OBJS_R = x.o y.o
LIBRARY = lib.a
PROG = prog
FLAGS = -c -D_GNU_SOURCE
CLEAN = clean
all: $(LIBRARY) $(PROG) $(CLEAN)
$(LIBRARY): $(OBJS_L)
$(CC) $(FLAGS) $(SRCS_L) -lpthread
ar -r lib.a $(OBJS_L)
$(PROG): $(OBJS_R)
$(CC) $(FLAGS) $(SRCS_R) -lpthread lib.a
$(OBJS_R) -o $(PROG)
$(CLEAN):
rm -rf *.o
有人可以告诉我,我在这做错了什么吗? 我收到一个错误,告诉我不可能制作第二个目标(PROG)而且也不能制作c.o,为什么? 提前谢谢
-lpthread - I'm trying to link library
答案 0 :(得分:2)
$(OBJS_R) -o $(PROG)
应该是:
$(CC) $(OBJS_R) -o $(PROG)
答案 1 :(得分:2)
我赞成了Banthar的答案,但是在旁注上我想我会提到使用替换你的目标文件会使你的Makefile不那么容易出错。
例如:
SRCS_L = a.c b.c c.c
OBJS_L = $(SRCS_L:.c=.o)
OBJS_L将始终是SRCS_L中定义的源的目标文件列表。
对于-lpthread问题:
仅在创建可执行文件时链接到库。
原件:
$(CC) $(FLAGS) $(SRCS_R) -lpthread lib.a
$(OBJS_R) -o $(PROG)
修正:
$(CC) $(FLAGS) $(SRCS_R) lib.a
$(CC) -lpthread $(LIBRARY) $(OBJS_R) -o $(PROG)
另外,我强烈建议将可执行文件和库分成单独的Makefile。这样做可以让您更轻松地移动和重用库,并简化Makefile的逻辑。
例如:
LIBRARY=my_lib.a
CC=gcc
SOURCES=$(wildcard *.c)
OBJECTS=$(SOURCES:.c=.o)
CFLAGS=-c -g -Wall
build: $(OBJECTS)
ar rcs $(LIBRARY) $(OBJECTS)
clean:
rm -rf $(LIBRARY) $(OBJECTS)
rebuild: clean build
$(OBJECTS):
$(CC) $(CFLAGS) $(@:.o=.c) -o $@
如上所示,为您使用Makefile意味着无论何时添加或删除源文件,都不必编辑Makefile。但请注意,您需要为您的库专用一个单独的目录,以便Makefile正常工作。