?

Log in

gcc: смешивание Си и С++ obj файлов - C/C++ Developers [entries|archive|friends|userinfo]
C/C++ Developers

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

gcc: смешивание Си и С++ obj файлов [Sep. 20th, 2015|12:45 am]
C/C++ Developers

ru_c

[simsun]
Здравствуйте!

Есть проектик из неск C файлов и с одним C++. "плюсовости" в нём нет кроме include заголовка библиотеки который тянет за собой другие плюсовые .h
Файлики собираются, но в финальный не линкуются. Ругается что из "плюсового" .obj не видятся функции находящиеся в .obj собранных из чистого Си.
Что то как будто с областью видимости. Пока переименовал в .c, отключил плюсовые include и руками добавил extern int func(...); Собралось и работает, но сей костыль непременно хочется как то победить....
linkReply

Comments:
[User Picture]From: leonov
2015-09-20 01:46 am (UTC)
Чтобы C++ понимал сишные функции, их заголовки нужно обернуть в extern "C" - или каждую, или блоком. Иначе линкер пытается найти плюсовые функции, для которых включено искажение имен.
http://stackoverflow.com/questions/1041866/in-c-source-what-is-the-effect-of-extern-c

(Reply) (Thread)
From: asox
2015-09-20 04:59 am (UTC)
А что-бы Си понимал "плюсовые" функции - придётся либо лепить прокладку, либо декорирование имён "ручками" прописывать.
(Reply) (Parent) (Thread)
[User Picture]From: simsun
2015-09-20 09:16 am (UTC)
спасибо!
(Reply) (Parent) (Thread)
From: asox
2015-09-20 12:46 pm (UTC)
Объявления сишных функций, вызываемых из кода C++ в заголовочных файлах обычно оборачивают конструкцию вида

#ifdef __cplusplus
extern "C"
{
#endif

/* Здесь объявляется функция */

#ifdef __cplusplus
}
#endif

(Точный вид символа лучше уточнить - например в заголовочных файлах.)

Аналогично можно определять прямо в коде C++ функции, которые потом будут вызываться из кода на Си - достаточно включить заголовочный файл вот с таким определением.
(Reply) (Parent) (Thread)
[User Picture]From: simsun
2015-09-20 12:57 pm (UTC)
спс!
я просто

extern "C"
{
...
}

обернул, все собралось
(Reply) (Parent) (Thread)
From: asox
2015-09-21 07:04 am (UTC)
То, что у меня - делается для большей лучшести.
Дабы одинаковые заголовочные файлы можно было использовать в Си и С++.
(Reply) (Parent) (Thread)
[User Picture]From: simsun
2015-09-21 01:42 pm (UTC)
у меня как у старого неуча глаза вытекают руки опускаются если надо разобрать С++ кот.. помню Си изучал когда - казалось бы... после asm - раз плюнуть, а нет! раза три брался,(тоже сейчас думаю, что там учить то?) А вот asm - отлично, может потому что с железной логики в микросхемах начинал...
Извините!) увлёкся:)
(Reply) (Parent) (Thread)
[User Picture]From: nicka_startcev
2015-09-20 08:17 am (UTC)
1. в с++ коде надо 'экспортируемые' функции декларировать как extern "C"

2. линковщику рассказать про стандартные плюсовые либы, например, вызывая для линковки g++
(Reply) (Thread)
[User Picture]From: simsun
2015-09-20 09:18 am (UTC)
спасибо!
чего только не придумают:(
(Reply) (Parent) (Thread)