У меня есть общая библиотека (в c++), которая имеет функцию foo() (объявленную как extern c), которая вызывается функцией в проекте в C, который компилируется automake. поэтому я hv makefile.am, который направляет на include.am, где я добавил имя и расположение моей библиотеки /../Release/lib/libabc.so к переменной xyz_LDADD, точно у меня есть xyz_LDADD = libabc.so
объявление foo выглядит так:
#ifdef __cplusplus
extern "C" {
#endif
void foo(void);
#ifdef __cplusplus
}
#endif
когда я пытаюсь сделать, я получаю неопределенную ссылку на ошибку foo().
Если я изменю имя d библиотеки abc, я получаю сообщение об ошибке, поэтому я предполагаю, что компилятор сможет найти библиотеку.
У меня также есть некоторые статические библиотеки, которые работают нормально. Может кто-нибудь помочь пожалуйста.. Спасибо заранее
Чтобы вызвать из c, метод c++ должен быть объявлен с помощью extern "C"
или в блоке extern "C"
extern "C"
. Не только в прототипе заголовка, но и в источнике.
Чтобы узнать, пытаюсь ли это найти символ foo в инструменте nm
.
как это:
nm../Release/lib/libabc.so | grep foo
если вы видите слово foo
без добавления, то метод foo
объявленный с помощью extern "C"
может быть использован из c-кода. если вы видите его с дополнительными символами до или после имени, то это c++, и он не может использоваться из c-кода.
nm
я вам дал.
xyz_LDADD = -L/../Release/lib/ -labc
? (обычно вы не ставите полное имя библиотеки, только часть после «lib» и перед «.so».