Код C, скомпилированный с C ++: неопределенная ссылка - PullRequest
7 голосов
/ 13 мая 2010

У меня есть небольшая программа, которую я могу без проблем скомпилировать с GCC и ICC, но я бы также хотел, чтобы код работал с G ++ и ICPC. Я пытался добавить это:

#ifdef __cplusplus
  extern "C" {
#endif

в начале и это:

#ifdef __cplusplus
  }
#endif

в конце всех заголовочных файлов, но я все еще получаю несколько «неопределенных ссылок на« ... »» ошибки.

Ответы [ 4 ]

7 голосов
/ 13 мая 2010

Я думаю, что вы ошибаетесь ... Внешний C предназначен для отключения функции искажения; поэтому, если вы делаете это только для заголовочных файлов, при попытке связать искаженный объектный код объявленные имена функций не будут совпадать с именами функций в объектном файле.

В любом случае, внешний C не добавляет переносимости, если все приложение компилируется и связывается с одним и тем же компилятором C ++, оно предназначено для смешивания библиотек C с кодом C ++.

Если ваш код находится в общем подмножестве C и C ++, вы уже должны быть в состоянии скомпилировать его с помощью любого компилятора, но я не вижу причины для этого (кроме работы по принципу наименьшего удивления, так как C ++ более строг с некоторыми вещами).

2 голосов
/ 13 мая 2010

Вы получаете неопределенные ссылки, потому что объявление и определение не совпадают, если вы введете extern "C", что предотвращает искажение имени: но в этом случае это происходит только в ваших заголовочных файлах.

1 голос
/ 13 мая 2010

Смотрите мой ответ на этот предыдущий вопрос: Когда использовать extern "C" в простых словах?

Надеемся, это должно прояснить, как смешивать код C и C ++.

1 голос
/ 13 мая 2010

Если одна из неопределенных ссылок - gxx_personality, то я бы сказал, что сообщение от "fortran" - правильное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...