2014-10-12 3 views
0

У меня есть общая библиотека (в C++), которая имеет функцию foo() (объявленную как extern c), которая вызывается функцией в проекте в C, которая скомпилирована automake. поэтому я hv makefile.am, который направляет на include.am, где я добавил имя и расположение моей библиотеки /../Release/lib/libabc.so к переменной xyz_LDADD, точно у меня есть xyz_LDADD = libabc.soundefined reference with automake

декларация обув выглядит следующим образом:

#ifdef __cplusplus 
extern "C" { 
#endif 
void foo(void); 
#ifdef __cplusplus 
} 
#endif 

, когда я пытаюсь сделать, я получаю неопределенную ссылку на обув ошибки().

Если я изменю имя d библиотеки abc, я получаю сообщение об ошибке, поэтому я предполагаю, что компилятор сможет найти библиотеку.

У меня также есть некоторые статические библиотеки, которые работают нормально. Может кто-нибудь помочь пожалуйста .. Заранее спасибо

+1

Вы пробовали: 'xyz_LDADD = -L /../ Release/lib/-labc'? (обычно вы не ставите полное имя библиотеки, просто часть после «lib» и до «.so». – Galik

+0

да, я пробовал, не работает :(еще неопределенная ошибка ссылки :(любые другие предложения, пожалуйста? – deesha

ответ

0

Чтобы вызвать из c, метод C++ должен быть объявлен extern "C" или в блоке extern "C". Не только в прототипе заголовка, но и в источнике.

Чтобы узнать, если это причина, попробуйте найти символ foo в инструменте nm.

так:

nm ../Release/lib/libabc.so | grep foo

если вы видите foo слово, без каких-либо добавлений, то метод foo объявлен с extern "C" и может быть использован из С кода. если вы видите его с дополнительными символами до или после имени, то он C++, и он не может использоваться из c-кода.

+0

Да, я вижу его без дополнительных символов, так как у меня есть extern C также в определении foo() :( – deesha

+0

@ tahl90 вы можете видеть его как undefined (U), вы должны указать код функции с телом. то, что вы дали, это объявление заголовка, оно не показало, как сама функция объявлена, а также поможет, если вы дадите результат «nm», который я вам дал. – SHR