вызов функции .cpp в файле .m и .mm, ошибка

0

Я пытаюсь интегрировать свой собственный небольшой проект cpp в большой проект цели-c. Я скомпилировал свой проект в файл.dylib и добавлен в большой проект, а файл.h включен. Но для того, чтобы следить за наследием, я должен вызвать свою функцию из файла.m в большом проекте.

Я знаю, что файл.m не может вызывать функции cpp, поэтому я попытался включить мой файл cpp.h в другой файл.mm, а затем в моем.m файле я включил заголовочный файл в файл.mm. вот что я сделал:

A.mm (я создал этот файл вместе с заголовком)

#import "A.h"
#include "mycppfunc.h"
int ParseFile(char * filename)
{
    ....(using cpp functions)
    return 0;
}

ах

int ParseFile(char* filename);

B.mm (первоначально в большом проекте)

#import "B.h"
#import "A.h"
.... (original codes in B.mm)

Bh

#import "C.h"
....

Cm (первоначально в большом проекте, я должен назвать свои собственные функции отсюда из-за наследия)

#import "C.h"
#import "B.h"
....
- (IBAction) call_my_proj: (id) sender
{
    ....
    ParseFile("myfile.txt");
}

Ch

.... (this file is un-changed)

Когда я скомпилирую, я получил эту ошибку:

Implicit declaration of function 'ParseFile' is invalid in C99

Может ли кто-нибудь помочь мне объяснить, где все пошло не так? Может ли это быть связано с круговой ссылкой на другой файл заголовка (но я не могу его изменить, так как он влияет на код других людей). как я могу избавиться от этой ошибки? Любая помощь высоко ценится! Благодарю.

  • 3
    Вы включаете Ah где-нибудь (например, из Ch или Cm)? Это единственное место, ParseFile определен ParseFile .
Теги:

3 ответа

0
Лучший ответ

Во-первых, вам нужно включить Ah из Ch или Cm.

Но поскольку функции, определенные в A.mm, скомпилированы с помощью компилятора (Obj) C++, вам может потребоваться сделать их вызываемыми из C. Вы делаете это с помощью C-ссылки. Затем ParseFile() должен быть вызван из Cm файла. Например, в файле заголовка:

extern "C"
{
   int ParseFile(const char *);
}
  • 0
    Спасибо, Натан, похоже, что это прогресс. я добавил #ifdef __cplusplus extern "C" {#endif int ParseFile (char * filename); #ifdef __cplusplus} #endif
  • 0
    Спасибо, Натан, похоже, что это прогресс. я добавил #ifdef __cplusplus extern "C" {#endif int ParseFile (char * filename); #ifdef __cplusplus} #endif и когда я компилирую, я больше не получаю ту же ошибку. однако, кажется, что это портит пространство имен в файле cpp (D.cpp), который вызывается A.mm (Dh включен в A.mm). я получил ошибку "переопределение '<namespace name>' как символа другого типа", и некоторые имена классов стали "undeclared" --- я получил ошибку "use undeclared identifier xxxx". Ты хоть представляешь, почему так стало?
Показать ещё 1 комментарий
1

Вы должны #include "Ah" в Cm. Вы вызываете ParseFile() в Cm.

  • 0
    Благодарю. но как только я включил Ах в Cm, я получил ошибку компоновщика
  • 0
    Неопределенные символы для архитектуры i386: "_ParseFile", на который ссылаются из: - [... здесь я вызываю функцию ParseFile] в Co ld: символ (ы) не найден для архитектуры i386 clang: error: сбой команды компоновщика с кодом выхода 1 (используйте -v, чтобы увидеть вызов)
0

Переименуйте расширение всех ваших файлов.m на.mm. Таким образом, вы можете напрямую вызывать функции cpp в ваших объектно-классах C без каких-либо оберток.

  • 0
    спасибо Lambda1, но я не могу изменить расширение, так как оно влияет на код, написанный другими людьми. что я могу сделать вместо этого?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню