Makefile的问题

时间:2011-05-29 23:07:39

标签: c makefile

每个人,我有这段代码,而且我也有错误:

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

2 个答案:

答案 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正常工作。