2015-04-01 2 views
0

Я пытаюсь скомпилировать несколько файлов .c, которые использовали функции msgpack-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 вместо прямого вызова ld. ld не знает о ССАГПЗЕ поддержки LIBS, которые необходимы для выполнения C:

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

Если это еще doesnt't работы, вам может понадобиться добавить -fno-stack-protector к вашему CFLAGS для подавления стека во время выполнения проверки.

+0

Спасибо, это сработало просто отлично! Только одно: флаг «-share» на самом деле «разделен», но он делает то, что ожидается, а именно для создания общей библиотеки. Опять же, спасибо – petermlm

+1

Спасибо. Я установил этот «-shared» -typo. Моя вина. – mfro

Смежные вопросы