Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> связать с++ и с, как правильно 
V
    Опции темы
slater
Дата 25.2.2011, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 168
Регистрация: 20.11.2009

Репутация: -2
Всего: -4



вечер добрый!

есть набор классов, которые предоставляют некую функциональность. Реализация классов использует стандартные с++ либы.
есть функция, где реализуется логика работы с данной библиотекой.

необходимо статически связать это все с сишным проектом.

Дело в том, что сам прект на Си, понятно, что я могу создать сишный модуль, там реализовать вызов функции, где реализован функционал работы с классами.

вопрос, как линковать?

с++ исходники g++.
сишные модули gcc.

а как связать с++ объектники и сишные?
я связывал вобщем то стандартно, gcc

все вроде бы проходит на ура.
но при запуске fatal error

как правильно поступить в таком случае?

заранее спасибо

Это сообщение отредактировал(а) slater - 25.2.2011, 22:16
PM MAIL   Вверх
alexvs11
Дата 25.2.2011, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: -1
Всего: 10



а какая ошибка точнее?
на самом деле основное ограничение - ++сные функции из сишного кода надо вызывать с объявлением extern "C"
PM MAIL   Вверх
maint
Дата 26.2.2011, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 12.5.2008

Репутация: нет
Всего: 2



из чистого  "С" нельзя вызвать C++. Пробегала статья, что вроде собираются реализовать для gcc. Но пока нет
PM   Вверх
slater
Дата 26.2.2011, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 168
Регистрация: 20.11.2009

Репутация: -2
Всего: -4



ошибка: не могу запустить, как то так.


PM MAIL   Вверх
sergioK1
Дата 26.2.2011, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(maint @ 26.2.2011,  06:12)
из чистого  "С" нельзя вызвать C++. Пробегала статья, что вроде собираются реализовать для gcc. Но пока нет

 ключ -combine не помогает ? 
PM MAIL   Вверх
xvr
Дата 26.2.2011, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(slater @ 26.2.2011,  10:10)
ошибка: не могу запустить, как то так.

А поточнее? Похоже на отсутствие библиотек. И еще момент - такую комбинированную программу надо линковать с помощью g++ (а не gcc)

PM MAIL   Вверх
bsa
Дата 26.2.2011, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Цитата(maint @  26.2.2011,  07:12 Найти цитируемый пост)
из чистого  "С" нельзя вызвать C++.

Можно. Только функции в С++ модулях должны быть объявлены с указанием extern "C" или в С должны вызываться по имени С++ символа (с учетом названий пространств имен и принимаемых типов аргументов), что мало переносимо и неудобно.
PM   Вверх
alexvs11
Дата 26.2.2011, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: -1
Всего: 10



Цитата(bsa @  26.2.2011,  11:44 Найти цитируемый пост)
Можно. Только функции в С++ модулях должны быть объявлены с указанием extern "C" или в С должны вызываться по имени С++ символа (с учетом названий пространств имен и принимаемых типов аргументов), что мало переносимо и неудобно.

те единственная проблема конвенция вызова и декорирования имени плюсовой функции
и то и то останавливает программа на стадии линковки
PM MAIL   Вверх
maint
Дата 26.2.2011, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 12.5.2008

Репутация: нет
Всего: 2



Цитата(bsa @ 26.2.2011,  11:44)
Цитата(maint @  26.2.2011,  07:12 Найти цитируемый пост)
из чистого  "С" нельзя вызвать C++.

Можно. Только функции в С++ модулях должны быть объявлены с указанием extern "C" или в С должны вызываться по имени С++ символа (с учетом названий пространств имен и принимаемых типов аргументов), что мало переносимо и неудобно.

Цитата

Можно. Только функции в С++ модулях должны быть объявлены с указанием extern "C" или в С должны вызываться по имени С++ символа (с учетом названий пространств имен и принимаемых типов аргументов), что мало переносимо и неудобно. 

в С++ понятно, что можно вызывать, не в этом вопрос. Это прописная истина. А вот в "С" вызвать плюсовую библиотеку... Примерчик работающий на gcc/g++. main должен быть из чистого "C". 
PM   Вверх
slater
Дата 26.2.2011, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 168
Регистрация: 20.11.2009

Репутация: -2
Всего: -4



текущий проект выложить не могу.

вот можно попробовать на этом учебном примере(во вложении), еще со студенчества отались.

в main_cpp.cpp Есть функция main(). Ее переименовываем (например, в test_cpp() ), создаем сишнй модуль ( например, test_c.c ) и пытаемся вызвать test_cpp() из сишного модуля.

Как это правильно скомпилить  и слинковать статически?

extern "C" - это для использования сишных функций в с++

Это сообщение отредактировал(а) slater - 26.2.2011, 14:52

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  employee.rar 4,40 Kb
PM MAIL   Вверх
alexvs11
Дата 26.2.2011, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: -1
Всего: 10



Цитата(slater @  26.2.2011,  14:45 Найти цитируемый пост)
extern "C" - это для использования сишных функций в с++

да?
PM MAIL   Вверх
slater
Дата 26.2.2011, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 168
Регистрация: 20.11.2009

Репутация: -2
Всего: -4



extern "C" is only defined in C++ compiliers
PM MAIL   Вверх
alexvs11
Дата 26.2.2011, 17:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: -1
Всего: 10



может быть дело в том, что плюсовый код предназначен для плюсов
для тех кто в бронепоезде

Код

[alexxx@localhost for_c]$ ls
1.c  2.cpp
[alexxx@localhost for_c]$ cat 1.c 
#include <stdio.h>

extern int get();

int main(){
    printf( "%d\n", get() );
    return 0;
}
[alexxx@localhost for_c]$ cat 2.cpp 
extern "C" int get(){
    return 5;
}
[alexxx@localhost for_c]$ gcc -c 1.c
[alexxx@localhost for_c]$ gcc -c 2.cpp 
[alexxx@localhost for_c]$ gcc 1.o 2.o -lstdc++
[alexxx@localhost for_c]$ ./a.out 
5



Это сообщение отредактировал(а) alexvs11 - 26.2.2011, 17:11
PM MAIL   Вверх
slater
Дата 26.2.2011, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 168
Регистрация: 20.11.2009

Репутация: -2
Всего: -4



alexvs11, вопрос не в этом
PM MAIL   Вверх
xvr
Дата 27.2.2011, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(slater @ 26.2.2011,  14:45)
в main_cpp.cpp Есть функция main(). Ее переименовываем (например, в test_cpp() ), создаем сишнй модуль ( например, test_c.c ) и пытаемся вызвать test_cpp() из сишного модуля.

Файл main_cpp.cpp
Код

extern "C" int test_cpp()
{
    Employee Emp1 ("Vasya","Pupkin",500);
    Employee Emp2 ("Luka","Mudischev",1000);
  ...
}

Файл test_c.c
Код

int test_cpp(void);

...

int val=test_cpp();
...


Цитата

Как это правильно скомпилить  и слинковать статически?

Добавьте файл test_c.o в список OBJS и добавьте зависимости

Makefile
Код

OBJS := Base.o Employee.o Manager.o Programmer.o TeamLeader.o test_cpp.o test_c.o
...

test_c.o: test_c.c
...


Цитата

extern "C" - это для использования сишных функций в с++
Вас кто то обманул - это ровно наоборот  smile 


Это сообщение отредактировал(а) xvr - 27.2.2011, 11:32
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.2514 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.