【问题标题】:How to link static lib in gcc make?如何在 gcc make 中链接静态库?
【发布时间】:2015-01-16 22:33:05
【问题描述】:

静态库在命令行中可以很好地链接,但不是通过 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 和命令行的屏幕截图。

【问题讨论】:

  • 在链接步骤中,库必须在最后。库的顺序很重要,除非库被分组,类似于:'gcc -Wl,--start-group -Wl,--end-group'

标签: c gcc makefile ld


【解决方案1】:

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

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

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

【讨论】:

  • 您说得对,即使对于库,链接 (ld) 的顺序也很重要。然而,就我而言,只有一个 .c 或 .o 文件和一个自己的静态库 libnowic.a 可以链接。没有机会产生循环依赖。
【解决方案2】:

根据 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!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    相关资源
    最近更新 更多