【发布时间】:2015-11-23 16:47:40
【问题描述】:
我正在尝试了解如何创建 Makefile。我有以下 Makefile:
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 $@
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,我终于编译了使用这个库的程序,这一切都很好。
但是,库libdemo.a 是可执行的,我认为不应该是这样的,对吧?
其次,我怎样才能让所有命令(make、make install 和 make all)按顺序运行,而不是单独调用它们?
【问题讨论】:
-
如果您删除
libdemo.a并重建它,它是否对新创建的文件具有可执行权限? -
通常,共享对象是读-执行的,而静态库是只读的。您可以通过将 0755 更改为 0644 在安装规则中控制这些权限。请查看
chmod的手册页以了解这些值及其含义。 -
@Erik 啊,很好,我完全错过了通过
install设置的权限。 -
make与make all相同 -
@RPGillespie 不,不是。
make与make <first valid target>相同。在这种情况下,是libdemo.a(来自$(STATIC))。