Я пытаюсь интегрировать свой собственный небольшой проект 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
Может ли кто-нибудь помочь мне объяснить, где все пошло не так? Может ли это быть связано с круговой ссылкой на другой файл заголовка (но я не могу его изменить, так как он влияет на код других людей). как я могу избавиться от этой ошибки? Любая помощь высоко ценится! Благодарю.
Во-первых, вам нужно включить Ah
из Ch
или Cm
.
Но поскольку функции, определенные в A.mm
, скомпилированы с помощью компилятора (Obj) C++, вам может потребоваться сделать их вызываемыми из C. Вы делаете это с помощью C-ссылки. Затем ParseFile()
должен быть вызван из Cm файла. Например, в файле заголовка:
extern "C"
{
int ParseFile(const char *);
}
Вы должны #include "Ah"
в Cm
. Вы вызываете ParseFile()
в Cm
.
Переименуйте расширение всех ваших файлов.m на.mm. Таким образом, вы можете напрямую вызывать функции cpp в ваших объектно-классах C без каких-либо оберток.
Ah
где-нибудь (например, из Ch или Cm)? Это единственное место,ParseFile
определенParseFile
.