Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
tiger()
3 / 3 / 0
Регистрация: 20.04.2011
Сообщений: 141
#1

Использование функции cpp в проекте c - C++

17.07.2013, 13:18. Просмотров 538. Ответов 5
Метки нет (Все метки)

Есть сишный проект, понадобилось прикрепить к нему один готовый плюсовый модуль.

Схематичный вид этого модуля:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//module.cpp
namespace module_namespace
{
  struct params
  {
    inline params() : field1(val1), field2(val2), field3(val3), field4(val4) { }
 
    inline type foo() const
    {
    ...
    }
 
    type1 field1;
    type2 field2;
    type3 field3;
    type4 field4;
  };
 
...
 
bool abc(const params &comp_params = params());
 
}
Мне нужно: воспользоваться функцией abc из сишного main.
Но параметр функции - плюсовая структура с конструктором, из си никак не вызывается напрямую.

1. Создал отдельный header (extern_api.h), подключил его и к модулю и к main.
2. Описал в extern_api.h новую структуру params_c, которая содержит только поля, но не содержит конструкторов (чтобы было как си без плюсовых наворотов).
3. Сделал в модуле функцию-прокси abc_c, которая вызывается из си и из себя вызывает abc. Вместо params имеет параметр params_c, так что теперь ее можно вызывать из си.

C++
1
2
3
4
5
//add to module.cpp
 bool abc_c(const params &comp_params = params())
    {
        return abc(comp_params);
    }
4. Добавил в структуру params еще один конструктор, который будет инициализироваться от типа params_c.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//updated module.cpp
  struct params
  {
    inline params() : field1(val1), field2(val2), field3(val3), field4(val4) { }
    inline params(params_c* p): field1(p->field1), field2(p->field2), field3(p->field3), field4(p->field4) { }
 
    inline type foo() const
    {
    ...
    }
 
    type1 field1;
    type2 field2;
    type3 field3;
    type4 field4;
  };
5. Вытащил в exterm_api.h объявление abc_c.

C++
1
2
3
4
5
6
7
8
9
10
//extern_api.h
    typedef struct
    {
       type1 field1;
       type2 field2;
       type3 field3;
       type4 field4;
    } params_c;
 
extern  bool abc_c(const params_c *comp_params);
6. Встроил в систему makefile'ов этот модуль, скомпилировал как библиотеку .a, прикрепил либу к main. То есть main теперь видит либу .a, где определена abc_c и видит extern_api.h, где она объявлена.

Получаю undefined reference к abc_c.

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

Пробовал различные комбинации с
C++
1
2
3
    #ifdef __cplusplus
    extern "C" {
    #endif
- не помогло. Куда это правильно поставить?

Еще есть ошибки с передачей параметра в abc, т.к. в объявлении и определении abc_c стоят параметры разных типов.

Как правильно настроить такую систему? Подскажите, пожалуйста, может я какую-нибудь ошибку не заметил..
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2013, 13:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Использование функции cpp в проекте c (C++):

в проекте - надо в проекте win32api вынести все в другой *cpp* а не получаеться - C++
определил функцию в другом спп и в основном ругается компилятор

Два файла .cpp в проекте - C++
Файлы DayOfWeek и main(откуда вызываются методы из DayOfWeek). Пишет ошибку на скрине,что не так? И что такое #include <stdexcept>? ...

Несколько cpp файлов в проекте - C++
Доброго времени суток ! Есть проект и в нем 2 cpp файла: Main.cpp и BinaryNumber.cpp В последнем файле создан класс и его методы....

Несколько *.cpp в одном проекте - C++
Добрый день! В приложении требуется несколько *.cpp как выполнить код каждой *.cpp ?

Подключение в проекте .hpp и .cpp файлов - C++
Добрый день! Среда разработки Code Blocks 13.12 Компилятор GNU GCC В проекте существует 3 файла в проекте - main.cpp, SW229.cpp и...

Как связать два cpp файла в одном проекте (visual studio 2010) - C++
Есть два программы: одна создает файл.txt, вторая читает из него данные и выводит на экран. создает файл #include <iostream> ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Evg
Эксперт CАвтор FAQ
17810 / 6016 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
17.07.2013, 15:01 #2
Цитата Сообщение от tiger() Посмотреть сообщение
5. Вытащил в exterm_api.h объявление abc_c.
А этот файл подключается к тому модулю, где реализация функции abc_c?

Покажи, что тебе напишет "arm-elf-readelf --symbols module.o" либо "arm-elf-nm module.o". Чтобы точно понимать, какой символ у тебя торчит в объектнике

Добавлено через 1 минуту
Использование C++ кода внутри программы на C: какие есть варианты?
0
tiger()
3 / 3 / 0
Регистрация: 20.04.2011
Сообщений: 141
17.07.2013, 15:36  [ТС] #3
Цитата Сообщение от Evg Посмотреть сообщение
А этот файл подключается к тому модулю, где реализация функции abc_c?

Покажи, что тебе напишет "arm-elf-readelf --symbols module.o" либо "arm-elf-nm module.o". Чтобы точно понимать, какой символ у тебя торчит в объектнике

Добавлено через 1 минуту
Использование C++ кода внутри программы на C: какие есть варианты?
extern_api.h да, подключается к module.cpp (там реализация abc_c).

arm-elf-nm module.o выдал много строк с разными указателями и среди них строка с этой функцией:
0000168c T abc

Пробовал еще добавлять extern "C" на реализацию abc_с, еще вытаскивал ее из namespace - одинаковый результат undefined reference.
0
Evg
Эксперт CАвтор FAQ
17810 / 6016 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
17.07.2013, 16:02 #4
Цитата Сообщение от tiger() Посмотреть сообщение
arm-elf-nm module.o выдал много строк с разными указателями и среди них строка с этой функцией:
0000168c T abc
Т.е. функции abc_c там нет, только abc?
0
tiger()
3 / 3 / 0
Регистрация: 20.04.2011
Сообщений: 141
18.07.2013, 11:44  [ТС] #5
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. функции abc_c там нет, только abc?
А, перепутал, да, обе есть, с меткой T.

Добавлено через 56 минут
А нет случаем какой-нибудь отдельной либы .a, скомпилированной из плюсов? Проверить будет ли цепляться какая-нибудь "левая". Вообще пока получается что плюсовые библиотеки в упор не видятся, хотя кладутся в нужное место и содержат в себе нужные функции. Любая другая из простых си - пожалуйста. Хотя насколько я знаю уже на этапе объектного файла нет различий между языками (кроме манглирования, которое в моем случае обходится стандартными extern "C".)

Кстати, манглирование происходит всегда, даже если в модуле нет перегруженных функций?

Добавлено через 29 минут
А, ну хотя наверное совсем левая не подойдет, надо же все-таки с использованием родного тулчейна

Добавлено через 3 часа 10 минут
Я разобрался в чем проблема была. Да, это невозможно было понять на расстоянии.
makefile-ы в проекте написаны так, что безусловно компилируется два варианта приложения: для обычного запуска и для запуска через GDB, отличаются наличием отладочной инфы.
Так вот библиотека "обычная" была нормальная и рабочая, но весь процесс валился, т.к. не мог собраться для дебаг-версии.

Evg, большое спасибо за помощь!
0
Evg
Эксперт CАвтор FAQ
17810 / 6016 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
18.07.2013, 14:42 #6
Цитата Сообщение от tiger() Посмотреть сообщение
Кстати, манглирование происходит всегда, даже если в модуле нет перегруженных функций?
Да.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2013, 14:42
Привет! Вот еще темы с ответами:

Использование в CPP переменной, описанной в H - C++
Подскажите, не могу сообразить что делаю не так. Решил перенести в свою библиотеку некоторые функции из своей программы. (Там для...

Использование .h и .cpp для классов - C++
class CSense_Sentence; class CSentence { public: CSentence(); void GetFromKeyboard(); bool IsConstruction(const string...

Использование параметра экземпляра класса из другого cpp - C++
Как использовать параметр экземпляра класса из другого cpp. Вот у меня есть Класс файл Character.h #ifndef _CHARACTER_H_ ...

Использование указателя AP в main.cpp крашит приложение - C++
System.h class System {...}; static LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.07.2013, 14:42
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru