如何在gcc make中link静态库?

How to link static lib in gcc make?

静态库可以在命令行中正常链接,但不能通过 makefile 链接。编译部分访问包含文件似乎没问题,但makefile中的ld进程一定是错误的。 提前感谢您的帮助!

这是我的命令行:

gcc -o quadEq.exe quadEq.c -I../include -L../lib -lnowic

这是我的 Makefile:

CFLAGS = -Wall -g -c
INCLUDE = -I../include
LDFLAGS = -L../lib
LDLIBS = -lnowic
SOURCES = quadEq.c
OBJECTS = $(SOURCES:.c=.o)

EXE = quadEq

all: $(SOURCES) $(EXE)

$(EXE): $(OBJECTS)
    gcc $(OBJECTS) $(LDFLAGS) $(LDLIBS) -o $@ 

.c.o:
    gcc $(CFLAGS) $(INCLUDE) $< -o $@ 

这是我的 运行 Makefile 和命令行的屏幕截图。

静态库关心您 link 它们的顺序。如果 libA.a 依赖于 libB.a,那么你必须做 -lB -lA

如果 libA.a 符号依赖于 libB.a,而 libB.a 又依赖于 libA.a 符号,则必须循环 link: -lB -lA -lB。我见过一些循环达到大约 3 或 4 个循环,但根据我的经验,通常 2 个就足够了。

这与动态库 linking 不同,后者不仅不关心您 link 它们的顺序,而且您也不需要 link 依赖库,因为.so 指定了它们。

根据 Aggieboy 的建议,我重写了 makefile 并使之生效。;

CC = gcc
CFLAGS = -x c -Wall -g 
INCPATH = -I../include
LIBPATH = -L../lib
LLIBS = -lnowic

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

顺便说一下,它接受一个文件名来从命令行参数中生成。 再次感谢 Aggieboy!