簡體   English   中英

如何使用C源代碼中的Makefile創建靜態庫

[英]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.cdemo2.c文件中創建一個靜態庫。 使用make install我將庫放在正確的目錄中並使用make all我最終編譯我的程序使用這個庫這很好。

但是,庫libdemo.a是可執行的,我認為不應該是這樣的,對吧?

第二,我怎樣才能使所有命令( makemake installmake 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM