C код скомпилировал с C++: неопределенная ссылка

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

#ifdef __cplusplus
  extern "C" {
#endif

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

#ifdef __cplusplus
  }
#endif

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

8
задан Suugaku 13 May 2010 в 13:53
поделиться

4 ответа

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

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

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

8
ответ дан 5 December 2019 в 14:01
поделиться

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

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

1
ответ дан 5 December 2019 в 14:01
поделиться

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

2
ответ дан 5 December 2019 в 14:01
поделиться

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

1
ответ дан 5 December 2019 в 14:01
поделиться