Я пытаюсь понять, как создать 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
является исполнимой, которая, как я думаю, не должна быть такой, не так ли?
И второе, как я могу сделать так, чтобы все команды (make
,и make all
) выполнялись последовательно, а не вызывали их по отдельности?
Если вы удалите 'libdemo.a' и перестройте его, у него есть исполняемые разрешения для вновь созданного файла? –
Обычно общими объектами являются read-execute и только что прочитанные статические библиотеки. Вы можете управлять этими разрешениями в правиле установки, изменив 0755 на 0644. Посмотрите справочную страницу '' 'chmod''' для объяснения этих значений и того, что они означают. – Erik
@ Erik Ah, хороший улов, я полностью пропустил разрешения, установленные через 'install'. –