C 在Linux中创建静态库时出现问题
我正在制作一个简单的库,用在我的应用程序中,省去了反复定义一些函数的麻烦 这是我的makefile:C 在Linux中创建静态库时出现问题,c,makefile,C,Makefile,我正在制作一个简单的库,用在我的应用程序中,省去了反复定义一些函数的麻烦 这是我的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 $^
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)
现在,如果我链接库,我会得到一个segfault,但是如果我链接我链接的对象文件来创建库,它会工作…建议?您的目标是libjimi.so,它是共享库的扩展,对于静态库,它应该是libjimi.a 请注意,当您使用静态库时,您只需像其他任何对象文件一样将其链接进来,但对于共享库,您使用-l语法。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
回显命令(前面没有@
)。@
完全适用于回声
;它的缺失将导致相同的信息出现两次。您的意思是在链接时或运行链接的可执行文件时出现seg错误吗?当然,您可以使用-ljimi链接,无论它是静态的还是动态的(对于libjimi.a或libjimi.so)。该库只需要位于搜索的目录之一(-L/some/where/lib以添加目录;-L.很少需要).我认为你是对的,但我记得我的问题是,在我的系统上同时存在libsomething.a和libsomething.so,当我需要.a版本时,-l开关总是选择.so版本而不是.a版本。