在Linux中创建静态库时出现问题

时间:2009-03-12 23:57:30

标签: c makefile

我在我的应用程序中使用一个简单的lib来省去一遍又一遍地定义一些函数的麻烦......

这是我的makefile:

CC=gcc
CFLAGS=-Wall -g -Wextra
OBJS=getline.o debug.o
LIB=libjimi.a
.PHONY: clean purge

libjimi.so : $(OBJS)
        ar rcs $(LIB) $(OBJS)
        @echo done!
%.o : %.c
        $(CC) $(CFLAGS) -c $^

clean :
        @rm *.o

purge : clean
        @rm $(LIB)

如果我链接库,现在我得到一个段错误,但如果我链接我链接的目标文件来创建库,它可以工作......建议吗?

2 个答案:

答案 0 :(得分:2)

您的目标是libjimi.so,它是共享库的扩展名,对于静态库,它应该只是libjimi.a。

请注意,当您使用静态库时,您只需将其链接到任何其他目标文件中,但使用共享库时,您可以使用-l语法。

答案 1 :(得分:1)

Linux(Unix)上的静态库通常以“.a”结尾;共享对象以“.so”结尾。您的图书馆规则目前是:

libjimi.so : $(OBJS)
    ar rcs $(LIB) $(OBJS)
    @echo done!

应该是:

$(LIB): $(OBJS)
    ar rcs $(LIB) $(OBJS)
    @echo done!

就个人而言,我倾向于使用

AR      = ar
ARFLAGS = rv

导致:

$(LIB): $(OBJS)
    $(AR) $(ARFLAGS) $(LIB) $(OBJS)

现在可以通过设置宏来调整构建的所有方面 - 如果需要的话。

在不知道崩溃发生的位置的情况下,很难知道可能导致崩溃的原因。 一种可能性是,由于makefile混淆,您将链接旧版本的库而不是当前工作版本。

顺便说一句,隐瞒cleanpurge目标正在做什么并不好;让make回显命令(前面没有@)要好得多。 @完全适用于echo;它的缺席将导致相同的信息被呈现两次。