我在我的应用程序中使用一个简单的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)
如果我链接库,现在我得到一个段错误,但如果我链接我链接的目标文件来创建库,它可以工作......建议吗?
答案 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混淆,您将链接旧版本的库而不是当前工作版本。
顺便说一句,隐瞒clean
或purge
目标正在做什么并不好;让make
回显命令(前面没有@
)要好得多。 @
完全适用于echo
;它的缺席将导致相同的信息被呈现两次。