проблемы с Makefile - PullRequest
       2

проблемы с Makefile

0 голосов
/ 30 мая 2011

каждый, у меня есть этот фрагмент кода, а также у меня есть ошибка:

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 ]

2 голосов
/ 30 мая 2011

Я проголосовал за ответ Бантэра, но, на мой взгляд, хотел бы упомянуть, что использование замещения для ваших объектных файлов сделает ваш 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 работали должным образом.

2 голосов
/ 30 мая 2011
$(OBJS_R) -o $(PROG) 

Должно быть:

$(CC) $(OBJS_R) -o $(PROG) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...