[英]How to create a static library with a Makefile from C source code
我試圖了解如何創建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
)按順序運行而不是單獨調用它們?
您通過先決條件鏈接目標。
為了得到你想要的(並有make
默認情況下做到這一點),你需要添加install
為您的先決條件all
目標(雖然我們將重新命名,在一分鍾),然后替換$(TARGET)
在install
先決條件使用$(STATIC)
或在賦值和目標行中用TARGET
替換STATIC
。
像這樣的東西:
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 $@ $^
.c.o:
@echo [Compile] $<
@$(CC) -c $(CFLAGS) $< -o $@
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
拼寫錯誤,並在某些配方中使用$@
, $^
和$<
代替顯式文件/變量名稱。
也就是說, 每次運行make all
時,這仍然會從program.c
make all
重建program
。
要修復你想要這樣做:
all: program
program: install program.c
$(CC) -g -Wall -o $@ program.c $(LDFLAGS) $(LIBS)
而不是你當前的all
目標。
請注意,由於install
先決條件,我無法在該配方中使用$<
或$^
來引用program.c
。 另請注意,這實際上並未解決“始終重建”問題(同樣是因為install
先決條件)。
重建問題的解決方案是根本沒有虛假的目標。
您可以使用真正的目標來代替副本,也可以讓-L
完成它的工作,而不必擔心libdemo.a
的本地副本。
all: program.c
$(CC) -g -Wall -o $@ $< $(LDFLAGS) $(LIBS)
但是,你實際上並沒有在這里任何地方鏈接到libdemo.a
,所以我不確定你在做什么。 (要與它鏈接,您需要-ldemo
或在鏈接命令中列出libdemo.a
。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.