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

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

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

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

17.07.2013, 13:18. Просмотров 515. Ответов 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 стоят параметры разных типов.

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

Использование .h и .cpp для классов C++
Как связать два cpp файла в одном проекте (visual studio 2010) C++
в проекте - надо в проекте win32api вынести все в другой *cpp* а не получаеться C++
Несколько *.cpp в одном проекте C++
Два файла .cpp в проекте C++
C++ Несколько cpp файлов в проекте
C++ Использование параметра экземпляра класса из другого cpp
Использование указателя AP в main.cpp крашит приложение C++
C++ Использование в CPP переменной, описанной в H
Использование MongoDB в С++ проекте C++
Подключение в проекте .hpp и .cpp файлов C++
Использование юникода в проекте? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17014 / 5419 / 335
Регистрация: 30.03.2009
Сообщений: 14,667
Записей в блоге: 26
17.07.2013, 15:01     Использование функции cpp в проекте c #2
Цитата Сообщение от tiger() Посмотреть сообщение
5. Вытащил в exterm_api.h объявление abc_c.
А этот файл подключается к тому модулю, где реализация функции abc_c?

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

Добавлено через 1 минуту
Использование C++ кода внутри программы на C: какие есть варианты?
tiger()
3 / 3 / 0
Регистрация: 20.04.2011
Сообщений: 141
17.07.2013, 15:36  [ТС]     Использование функции cpp в проекте c #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.
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17014 / 5419 / 335
Регистрация: 30.03.2009
Сообщений: 14,667
Записей в блоге: 26
17.07.2013, 16:02     Использование функции cpp в проекте c #4
Цитата Сообщение от tiger() Посмотреть сообщение
arm-elf-nm module.o выдал много строк с разными указателями и среди них строка с этой функцией:
0000168c T abc
Т.е. функции abc_c там нет, только abc?
tiger()
3 / 3 / 0
Регистрация: 20.04.2011
Сообщений: 141
18.07.2013, 11:44  [ТС]     Использование функции cpp в проекте c #5
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. функции abc_c там нет, только abc?
А, перепутал, да, обе есть, с меткой T.

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

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

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

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

Evg, большое спасибо за помощь!
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17014 / 5419 / 335
Регистрация: 30.03.2009
Сообщений: 14,667
Записей в блоге: 26
18.07.2013, 14:42     Использование функции cpp в проекте c #6
Цитата Сообщение от tiger() Посмотреть сообщение
Кстати, манглирование происходит всегда, даже если в модуле нет перегруженных функций?
Да.
Yandex
Объявления
18.07.2013, 14:42     Использование функции cpp в проекте c
Ответ Создать тему
Опции темы

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