У меня есть librdma.a, который мне нужно связать с моим текущим проектом. Когда я бегу нм на librdma.a вот что я получаю:
0000000000000000 T set_attribute
Это означает, что функция доступна в коде.
Теперь, когда я пытаюсь связать это . файл моего текущего проекта и создать . файл для этого с помощью этого Makefile.am: —
noinst_LTLIBRARIES= libsrc.la
libsrc_la_SOURCES= One.cpp \
Two.cpp \
libsrc_la_CPPFLAGS = -I$(top_srcdir)/inc -I$(rdma_dir)/include
libsrc_la_LIBADD = -L$(rdma_dir)/lib -lrdma
Это создает файл libsrc.a, который технически должен иметь определение set_attribute (), функции, которую я пытаюсь использовать. Но когда я бегу нм в этом архивном файле я получаю неопределенную ссылку.
U _Z8set_attributePP5attrlPcS2_
Кроме того, когда я пытаюсь делать полный проект, который в свою очередь использует этот файл libsrc.a, я получаю такие ошибки: —
../libfinal/.libs/libfinal.so: undefined reference to `set_attribute()'
Похоже, вы смешиваете библиотеку C с библиотекой C ++, а заголовки для библиотеки C не помещаются в extern C
блок. Таким образом, в первой библиотеке и в библиотеке, на которую она ссылается, вы получите искаженное имя _Z8set_attrPP5attrlPcS2_.
Других решений пока нет …