2015-11-23 4 views
1

Я пытаюсь понять, как создать Makefile. У меня есть следующий файл Makefile:Как создать статическую библиотеку с Makefile из исходного кода C

DESTDIR=../../ 
PREFIX=../ 

STATIC=libdemo.a 

CC = gcc 
CFLAGS = -Wall -Winline -pipe 

LDFLAGS = -L../../../lib 
LIBS = -lpthread 

SRC = demo1.c demo2.c 

OBJ = $(SRC:.c=.o) 

$(STATIC): $(OBJ) 
     @echo "[Link (Static)]" 
     @ar rcs $(STATIC) $(OBJ) 

.c.o: 
     @echo [Compile] $< 
     @$(CC) -c $(CFLAGS) $< -o [email protected] 

clean: 
     rm -f $(OBJ) *~ core tags *.bak Makefile.bak libgeniePi.* 

.PHONEY:  install 
install:  $(TARGET) 
     @install -m 0755 libdemo.a $(DESTDIR)$(PREFIX)/lib 

all: 
     gcc -g -Wall -o program program.c $(LDFLAGS) $(LIBS) 

Что почти делает то, что я хочу. С make Я создаю статическую библиотеку из файлов demo1.c и demo2.c. С make install Я поместил библиотеку в нужную директорию и с make all Я, наконец, скомпилирую мою программу, которая использует4s эту библиотеку, все в порядке.

Однако библиотека libdemo.a является исполнимой, которая, как я думаю, не должна быть такой, не так ли?

И второе, как я могу сделать так, чтобы все команды (makemake all) выполнялись последовательно, а не вызывали их по отдельности?

+1

Если вы удалите 'libdemo.a' и перестройте его, у него есть исполняемые разрешения для вновь созданного файла? –

+2

Обычно общими объектами являются read-execute и только что прочитанные статические библиотеки. Вы можете управлять этими разрешениями в правиле установки, изменив 0755 на 0644. Посмотрите справочную страницу '' 'chmod''' для объяснения этих значений и того, что они означают. – Erik

+1

@ Erik Ah, хороший улов, я полностью пропустил разрешения, установленные через 'install'. –

ответ

3

Вы целенаправляете цели с помощью необходимых условий.

Чтобы получить то, что вы хотите (и иметь make сделать это по умолчанию), необходимо добавить install как предпосылка вашей all цели (хотя мы будем переименовывать, что в минуту) и либо заменить $(TARGET) в install необходимо с $(STATIC) или заменить STATIC на TARGET в целевой и целевой линии.

Что-то вроде этого:

DESTDIR=../../ 
PREFIX=../ 

STATIC=libdemo.a 

CC = gcc 
CFLAGS = -Wall -Winline -pipe 

LDFLAGS = -L../../../lib 
LIBS = -lpthread 

SRC = demo1.c demo2.c 

OBJ = $(SRC:.c=.o) 

$(STATIC): $(OBJ) 
     @echo "[Link (Static)]" 
     @ar rcs [email protected] $^ 

.c.o: 
     @echo [Compile] $< 
     @$(CC) -c $(CFLAGS) $< -o [email protected] 

clean: 
     rm -f $(OBJ) *~ core tags *.bak Makefile.bak libgeniePi.* 

.PHONY: install 
install: $(STATIC) 
     @install -m 0755 $< $(DESTDIR)$(PREFIX)/lib 

all: install 
     $(CC) -g -Wall -o program program.c $(LDFLAGS) $(LIBS) 

Также обратите внимание, что я установил свою .PHONEY опечатку и использовал [email protected], $^ и $< вместо имен переменных/Явных файлов в некоторых из рецептов.

Это сказал, что это все еще оставит make all восстановление program из program.cкаждый раз при запуске make all.

Чтобы исправить, что вы хотите сделать это:

all: program 

program: install program.c 
    $(CC) -g -Wall -o [email protected] program.c $(LDFLAGS) $(LIBS) 

вместо текущей all цели.

Заметьте, однако, что я не мог использовать $< или $^ в этом рецепте для обозначения program.c из-за install предпосылку. Также обратите внимание, что это фактически не исправляет проблему «всегда перестраивать» (опять же из-за install).

Исправление проблемы восстановления состоит в том, чтобы вообще не иметь фальшивой цели.

Вы можете использовать реальную цель для копии или просто позволить -L выполнить свою работу и не беспокоить местную копию libdemo.a.

all: program.c 
    $(CC) -g -Wall -o [email protected] $< $(LDFLAGS) $(LIBS) 

Но тогда снова вы на самом деле не ссылки на libdemo.a где-нибудь здесь, так что я не уверен, что вы делаете с ним. (Для связи с ним вам понадобится -ldemo или перечислить libdemo.a в команде связывания.)

+3

Замечательно переработано, хотя правило '' 'all''' все еще использует gcc непосредственно вместо макроса CC. Небольшая нить. – Erik

+0

libdemo.a будет установлен в 'LDFLAGS', а затем связан в' all' праве? – Tom

+0

спасибо, что сообщение это потрясающе! – Tom

Смежные вопросы