У меня есть небольшая программа, которую я могу скомпилировать с GCC и ICC без любых трудностей, но я также хотел бы, чтобы код работал с G ++ и ICPC. Я пытался добавить это:
#ifdef __cplusplus
extern "C" {
#endif
вначале и это:
#ifdef __cplusplus
}
#endif
в конце всех заголовочных файлов, но я все еще получаю несколько 'неопределенных ссылок на "..."' ошибки.
Я думаю, вы ошибаетесь ... Внешний C предназначен для отключения функции искажения; поэтому, если вы сделаете это только для файлов заголовков, когда вы попытаетесь связать искаженный объектный код, объявленные имена функций не будут совпадать с именами функций в объектном файле.
В любом случае, extern C не добавит переносимости, если все приложение компилируется и компилируется с одним и тем же компилятором C ++, он предназначен для смешивания библиотек C с кодом C ++.
Если ваш код находится в общем подмножестве C и C ++, вы уже должны быть в состоянии скомпилировать его с помощью любого из компиляторов, но я не вижу причины для этого (кроме работы по принципу наименьшего удивления, поскольку C ++ является с некоторыми вещами строже).
См. Мой ответ на этот предыдущий вопрос: Когда использовать extern «C» простыми словами?
Надеюсь, это должно прояснить, как смешивать код C и C ++.
Вы получаете неопределенные ссылки, потому что объявление и определение не совпадают, если вы поместите extern "C"
, что предотвращает искажение имени происходит: но в этом случае это происходит только в ваших файлах заголовков.
Если одной из неопределенных ссылок является gxx_personality, то я бы сказал, что сообщение "fortran" верно.