如何在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!
静态库可以在命令行中正常链接,但不能通过 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!