[英]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.