簡體   English   中英

如何用 Makefile 制作 static 庫?

[英]How to make static libraries with Makefile?

這是Makefile

CC=gcc
CFLAGS=-Wall -pedantic -Werror -g 
LDFLAGS=-lm
RM=rm -f
SOURCES=$(wildcard *.c)
TARGETS=$(SOURCES:.c=)
OBJECTS=$(SOURCES:.c=.o)

.PHONY: all clean

all: test_stack

%: %.c
    $(CC) $(CFLAGS) $(LDFLAGS) $< -o $@

%.o: %.c
    $(CC) $(CFLAGS) -c -o $@  $< 

%.a: %.o
    ar rcs $@ $<
    ranlib $@

test_stack: genstacklib.a test_stack.o
    $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

clean:
    $(RM) $(OBJECTS) $(TARGETS)

我有文件 genstacklib.c、genstacklib.h 和 test_stack.c 現在我想將 genstacklib 編譯為 static 庫 當 test_stack 調用 genstacklib 的方法時,它會拋出異常:例如:“對 `genStackNew' 的未定義引用”我不不明白為什么 test_stack 無法訪問這些方法,就我目前的理解而言,它應該可以訪問該庫。

請復制並粘貼您在問題中遇到的確切錯誤,格式正確,並包括打印的編譯或鏈接命令。 像“拋出異常”這樣的語句並不准確,事實上也不是很准確,因為異常是從正在運行的程序中拋出的,但是(如果我正確理解你的問題)你無法鏈接你的程序。

問題是 arguments 到 linker 的順序很關鍵:所有都必須出現在所有 object 文件之后的鏈接行上。 圖書館的順序也很重要,但因為你只有一個,所以這不是問題。

在你的規則中:

test_stack: genstacklib.a test_stack.o
        $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

$^變量擴展為先決條件,在本例genstacklib.a test_stack.o 因此,在您的鏈接行上,庫將出現object 文件之前,這是行不通的。 像這樣重寫你的規則:

test_stack: test_stack.o genstacklib.a
        $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

所以庫在 object 文件之后,它可能會工作。

順便說一句,變量LDFLAGS通常包含管理 linker 的標志。像-lm這樣的庫引用傳統上被放入變量LDLIBS中。 當然,這只是約定俗成,但除非有充分的理由不這樣做,否則遵循約定是很有用的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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