2015-04-01 65 views
0

我想编译几个使用msgpack-c函数到一个共享库的.c文件。我有下面的Makefile:如何正确链接msgpack到共享库

MSGPACK_CS = msgpack.c 

CFLAGS = -std=c99 

MSGPACK_OBJECTS = $(subst .c,.o,$(MSGPACK_CS)) 

MSGPACK_LIBS = msgpack.so 

all: $(MSGPACK_OBJECTS) $(MSGPACK_LIBS) 

%.o: %.c 
    $(CC) -c -shared -fPIC $(CFLAGS) $< 

$(MSGPACK_LIBS): $(MSGPACK_OBJECTS) 
    ld -Lmsgpack/.libs -share -o [email protected] $(MSGPACK_OBJECTS) -lmsgpack 

我可以编译使用msgpack没有问题的程序,但是这给了我以下错误:

msgpack.o: In function `msgpack_pack_int64': 
/usr/local/include/msgpack/pack_template.h:373: undefined reference to `__stack_chk_fail_local' 
ld: msgpack.so: hidden symbol `__stack_chk_fail_local' isn't defined 
ld: final link failed: Bad value 

显然联动过程并不顺利,但我不知道什么是错的。我能做什么?

回答

1

尝试使用gcc驱动程序进行链接,而不是直接调用ldld不知道所需要的C运行时的GCC支持库:

gcc -Lmsgpack/.libs -shared -o [email protected] $(MSGPACK_OBJECTS) -lmsgpack 

如果仍然doesnt't工作,你可能需要添加-fno-stack-protector到您的CFLAGS来剿运行时堆栈检查。

+0

谢谢,这工作得很好!只有一件事,“共享”标志实际上是“共享”的,但它符合预期的要求,即创建共享库。再次感谢 – petermlm 2015-04-02 13:20:22

+1

谢谢。我修正了“共享”-typo。我的错。 – mfro 2015-04-02 15:47:53