реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Совместное использование *.сpp файлов и *.c, Не компилируются совместно файлы Си и Си++
kolobochishe
сообщение Jun 9 2011, 07:22
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Вот такая ошибка при вызове функции написанной в *.cpp файле из *.с файла

Linking
Error[Li005]: no definition for "plot_spectrum" [referenced from C:\ÐÀÁÎÒÀ\ÐÀÇÐÀÁÎÒÊÈ\ÏÐÎÅÊÒÛ\ÄÐÀÊÎÍ\Ðåãèñòðàòîðû\Ïðîøèâêà\
LPC3250 GUI_RTOS\arm\PowerPac\BoardSupport\NXP\LPC3250\Output\LPC3250\Debug_SDRAM\Obj\DRAGON_BS1_GUI.o]
Error while running Linker

Функция объявлена в соответствующем *.h файле. Он подключен везде, где требуется.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 9 2011, 07:43
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



В хедерах си-шных модулей надо вставить скобки
Код
#ifdef __cplusplus
BEGIN_EXTERN_C
#endif
...
#ifdef __cplusplus
END_EXTERN_C
#endif

, где
Код
#define BEGIN_EXTERN_C           extern "C" {
#define END_EXTERN_C             }


Компилировать и линковать в режиме "плюсов"


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 9 2011, 07:46
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Проще прямо написать
Код
#ifdef __cplusplus
extern "C" {
#endif
...
#ifdef __cplusplus
}
#endif


Сообщение отредактировал IgorKossak - Jun 9 2011, 07:51
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Jun 9 2011, 08:05
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Цитата(MrYuran @ Jun 9 2011, 12:43) *
В хедерах си-шных модулей надо вставить скобки
Код
#ifdef __cplusplus
BEGIN_EXTERN_C
#endif
...
#ifdef __cplusplus
END_EXTERN_C
#endif

, где
Код
#define BEGIN_EXTERN_C           extern "C" {
#define END_EXTERN_C             }


Компилировать и линковать в режиме "плюсов"


Компилится. Только не в хэдерах си-шных модулей, а в хэдере си++ модуля. У меня только так заработало.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jun 9 2011, 09:47
Сообщение #5


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(kolobochishe @ Jun 9 2011, 12:05) *
Компилится. Только не в хэдерах си-шных модулей, а в хэдере си++ модуля. У меня только так заработало.

Можно ставить с любых заголовочных файлах, которые включаются в проект для с и cpp.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
inventor
сообщение Jun 16 2011, 18:24
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(mdmitry @ Jun 9 2011, 13:47) *
Можно ставить с любых заголовочных файлах, которые включаются в проект для с и cpp.

в принципе если извратица то можно из сишной программы вызывать с++ модули.
у вас проблема в том, что С++ делает такую хрень как name mangling.
то есть при линковке имена ваших функций становятся такими что их сишный линкер
не может понять.
решение которое вам подсказали вверху заставляет линкер не искажать имя функции.
но если вы попробуете предложить несколько функций с одинаковым названием-перегруженные,
то опять получите ошибку.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 17 2011, 10:24
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(inventor @ Jun 16 2011, 22:24) *
в принципе если извратица то можно из сишной программы вызывать с++ модули.


Если вы можете компилировать с++ модули (компилятор позволяет), то никто не мешает сказать ему, чтобы для компиляции .с модулей тоже вызывался С++ компилятор. На худой случай, просто переименовать *.с в *.срр.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 17 2011, 12:54
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (sergeeff @ Jun 17 2011, 13:24) *
просто переименовать *.с в *.срр.

С и С++ два разных языка - сколь-нибудь объемный и что-то делающий исходник на 'C' (не "Hello World!" ) плюсовым компилятором не откомпилится. Потребуются правки. В большей частью мелкие, но местами и принципиально все меняющие.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 17 2011, 13:20
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(zltigo @ Jun 17 2011, 16:54) *
С и С++ два разных языка - сколь-нибудь объемный и что-то делающий исходник на 'C' (не "Hello World!" ) плюсовым компилятором не откомпилится. Потребуются правки. В большей частью мелкие, но местами и принципиально все меняющие.


Хоть один пример.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 17 2011, 13:33
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (sergeeff @ Jun 17 2011, 16:20) *
Хоть один пример.

Берете свой проект, компилите плюсовым. Получаете примеры sm.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 17 2011, 13:40
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (sergeeff @ Jun 17 2011, 16:20) *
Хоть один пример.
Область видимости констант, неявное приведение void * к любому указателю в С. Это так, навскидку.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Danis
сообщение Jun 17 2011, 13:57
Сообщение #12


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Цитата(sergeeff @ Jun 17 2011, 16:20) *
Хоть один пример.


для С++ NULL не типизирован явно, как в Си, так что приходиться делать так:

/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 17 2011, 13:59
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Сергей Борщ @ Jun 17 2011, 16:40) *
Область видимости констант, неявное приведение void * к любому указателю в С. Это так, навскидку.

Декларация и инициализация стуктур и константных объектов, тип литералов типа 'abcd', объявления типов в sizеof, , функции с переменным количеством аргументов, еще некоторые до сих пор не польззуются прототипами функций sm.gif и C а не C99,..... В общем лучше попробовать компильнуть sm.gif
Вообще-то в С++ стандарте, помнится, было целое приложение посвященное проблемам несовместимости.

P.S.
Да. Посмотрел - Annex C Compability. Единственно, что там явно не C99. Да и многие 'С' компиляторы будут на некоторые конструкции хоть не ошибки, но warnings выдавать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
dxp
сообщение Jun 17 2011, 14:09
Сообщение #14


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Сергей Борщ @ Jun 17 2011, 20:40) *
Область видимости констант, неявное приведение void * к любому указателю в С. Это так, навскидку.

Ещё работа с перечислимыми типами.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 18 2011, 09:38
Сообщение #15


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



А наоборот может быть - ошибка при вызове из си++ файла функции, объявленной в простом си исходнике?

Ошибка такая же - Li005 - линкер не может найти определение функции... sad.gif
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 04:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01514 секунд с 7
ELECTRONIX ©2004-2016