Создать общую библиотеку, но неопределенные ссылки на функции? - PullRequest
1 голос
/ 29 марта 2011

У меня есть базовая общая библиотека, которую я создаю для практики, и все, что она определяет, это заполнитель функций в виде

int placeholder() { return 1; }

Я создаю ее так же, как для libtool в make-файле для простоты (соответствующие части):

libfootest: $(OBJECTS)
    libtool --mode=link $(CC) -g -O -o libfootest.la $(OBJECTS)\
          -rpath /usr/lib

libfootest.o: $(SRCDIR)/$(SOURCES)
    libtool --mode=compile $(CC) -c $(SRCDIR)/$(SOURCES)

install: libfootest
    libtool --mode=install cp libfootest.la /usr/lib/libfootest.la

Теперь я могу убедиться, что a) Он установлен с соответствующими .so.* и .la, b) nm имеет символ placeholder, определенный в отдельном libtoolобъект (libfootest.o до ссылки), я считаю, что это все, что мне нужно.

Я сейчас создаю программу для целей тестирования,

#include "../includes/libfootest.h" //public prototypes are here
int main() {
  int test = placeholder();
  return 0;
}

И ссылки это как -lfootest и он найден, хотя, к сожалению, я получаю неопределенную ссылочную ошибку для заполнителя!

/tmp/cc92NtSa.o: In function `main':
prototypes.cxx:(.text+0x19): undefined reference to `placeholder()'

Можете ли вы определить, что я сделал неправильно, или есть какой-то экспорт, который я должен выполнить длябиблиотека для работы?Я видел, как некоторые API-интерфейсы используют DLLEXPORT или аналогичные до их объявления функций, я не уверен, что они делают.

1 Ответ

1 голос
/ 04 апреля 2011

prototypes.cxx был скомпилирован в режиме C++, в результате чего ссылка на placeholder() приобрела C++ связь имени (и получила искаженное ).

Если вы намереваетесь вызвать placeholder() как из C, так и из C++, вы должны добавить связь extern "C" к его прототипу при сборке в режиме C++:

#ifdef __cplusplus
extern "C"
#endif
int placeholder();

Если вы намереваетесь использовать placeholder() только с C++, то создайте библиотеку с CXX вместо CC.

...