Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在Linux中创建静态库时出现问题_C_Makefile - Fatal编程技术网

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

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 $^

我正在制作一个简单的库,用在我的应用程序中,省去了反复定义一些函数的麻烦

这是我的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)

现在,如果我链接库,我会得到一个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版本。