如何正确地将msgpack链接到共享库中

时间:2015-04-01 23:04:21

标签: c gcc makefile ld msgpack

我正在尝试将使用msgpack-c函数的几个.c文件编译到共享库中。我有以下Makefile:

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 $@ $(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 个答案:

答案 0 :(得分:1)

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

gcc -Lmsgpack/.libs -shared -o $@ $(MSGPACK_OBJECTS) -lmsgpack

如果这仍然不起作用,您可能需要将-fno-stack-protector添加到CFLAGS以压缩运行时堆栈检查。