C / C ++: правильные места для использования extern для моей библиотеки? - PullRequest
0 голосов
/ 29 марта 2011

Я делаю разделяемую библиотеку, и ее функции оставались неопределенными во время компоновки при сборке (и при связывании с тестовой программой), и теперь я изучил искажение имен и почему это может вызвать что-то подобное.

Я предполагаю, что в заголовке libfoo.h я бы поставил:

#ifdef __cplusplus
  extern "C" {
#endif
int foobar();
#ifdef __cplusplus
  }
#endif

И будут ли внешние элементы для прототипов быть всем, что мне нужно для их применения, или мне нужно будет обернуть их вокруг объявлений функций в libfoo.c, чтобы моя программа на C ++ могла их читать?

Обновление для комментария ниже:

Ошибка компоновки:

g++ prototypes.cxx -L/usr/lib/  -lfoo
/tmp/ccKQmen4.o: In function `main':
prototypes.cxx:(.text+0x19): undefined reference to `foobar()'
collect2: ld returned 1 exit status

Ответы [ 2 ]

0 голосов
/ 29 марта 2011

В FAQ C ++ есть целый раздел, посвященный смешиванию C и C ++ http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.4

По сути, единственное место, где можно поставить extern "C", - это заголовочные файлы, включенные в C и C ++.Если вы не можете их контролировать, следуйте предыдущему ответу (32.3).

0 голосов
/ 29 марта 2011

Вам не нужно ничего делать с исходным кодом, если вы компилируете его с помощью компилятора C.

Это то, что вы говорите компилятору C ++ в заголовке - используйте соглашения C о вызовах и именах.

...