2016-12-23 85 views
0

如何在Makefile中創建動態和靜態庫。我有C代碼。在inc文件夾中包含所有包含的頭文件以及此文件夾外的C文件。我想創建.a和.so庫。我如何包含通配符來說明所有的文件將被執行。 我試過這種方式。如何在Makefile中創建靜態和動態庫?

CFLAGS := -fPIC -O3 -g -Wall -Werror 
CC := gcc 
MAJOR := 0 
MINOR := 1 
NAME := foo 
VERSION := $(MAJOR).$(MINOR) 

lib: lib$(NAME).so 

lib$(NAME).so.$(VERSION): $(NAME).o 
    $(CC) -shared -Wl,-soname,lib$(NAME).so.$(MAJOR) $^ -o $(wildcard %.c) 

clean: 
    $(RM) *.o *.so* 
+0

發佈的makefile只會生成一個.so庫。您需要添加第一個目標,類似於:'all:lib $(NAME).so。$(VERSION)lib $(NAME).a。$(VERSION)'然後編寫一個額外的配方來生成靜態庫(lib $(NAME).a。$(VERSION) – user3629249

回答

2
CFLAGS := -fPIC -O3 -g -Wall -Werror 
CC := gcc 
MAJOR := 0 
MINOR := 1 
NAME := foo 
VERSION := $(MAJOR).$(MINOR) 

LIBSO = lib$(NAME).so 
LIBSOM = $(LIBSO).$(MAJOR) 
LIBSOV = $(LIBSO).$(VERSION) 
LIBA = lib$(NAME).a 

lib: $(LIBSO) $(LIBA) 

$(LIBSO): $(LIBSOV) 
    ln -s $(LIBSOV) $(LIBSO) 

$(LIBSOV): $(NAME).o 
    $(CC) $(CFLAGS) -shared -Wl,-soname,$(LIBSOM) -o $(LIBSOV) $(NAME).o 

$(LIBA): $(NAME).o 
    $(AR) $(ARFLAGS) $(LIBA) $(NAME).o 

clean: 
    $(RM) *.o *.so* 

檢查,以確保宏ARARFLAGS適當設置(arru點左右 - 我通常使用ruv)。

我不清楚爲什麼你只有一個目標文件foo.o,或者實際上你是否想要目錄中的每個C源文件都被編譯到目標文件中幷包含在庫中 - 你的共享目標的鏈接命令是(它會覆蓋第一個.c文件作爲它創建的共享對象)。

如果你想在庫的詳細目標文件,然後定義:

SOURCE := $(wildcard *.c) 
OBJECT := $(SOURCE:.c=.o) 

,並在規則中使用$(OBJECT)代替$(NAME).o。就個人而言,我不相信通配符 - 測試程序代碼等被包含在庫中的風險太大,我的安慰。因人而異。

+0

感謝它的工作:) – Dulguuntur