【问题标题】:How to properly link msgpack into a shared library如何正确地将 msgpack 链接到共享库
【发布时间】:2015-04-01 23:04:20
【问题描述】:

我正在尝试将一些使用 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

显然链接过程不顺利,但我不知道出了什么问题。我能做什么?

【问题讨论】:

    标签: c gcc makefile ld msgpack


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢你,这很好用!只有一件事,“-share”标志实际上是“-shared”,但它做了预期的事情,即创建一个共享库。再次感谢
    • 谢谢。我修复了那个“-shared”-typo。我的错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多