Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用.m和.mm文件中的.cpp函数时出错_C++_Objective C_Mixing - Fatal编程技术网

C++ 调用.m和.mm文件中的.cpp函数时出错

C++ 调用.m和.mm文件中的.cpp函数时出错,c++,objective-c,mixing,C++,Objective C,Mixing,我正在尝试将我自己的小型cpp项目整合到一个大型objective-c项目中。我已经将自己的项目编译成一个.dylib文件并添加到这个大项目中,其中包括了.h文件。但是为了遵循传统,我必须从大项目中的.m文件调用我的函数 我知道.m文件不能调用cpp函数,所以我尝试将我的cpp.h文件包含在另一个.mm文件中,然后在.m文件中将头文件包含到.mm文件中。以下是我所做的: A.mm(我创建了这个文件和标题) A.h B.mm(最初在大项目中) B.h C.m(最初在大项目中,由于遗留问题,我不得不

我正在尝试将我自己的小型cpp项目整合到一个大型objective-c项目中。我已经将自己的项目编译成一个.dylib文件并添加到这个大项目中,其中包括了.h文件。但是为了遵循传统,我必须从大项目中的.m文件调用我的函数

我知道.m文件不能调用cpp函数,所以我尝试将我的cpp.h文件包含在另一个.mm文件中,然后在.m文件中将头文件包含到.mm文件中。以下是我所做的:

A.mm(我创建了这个文件和标题)

A.h

B.mm(最初在大项目中)

B.h

C.m(最初在大项目中,由于遗留问题,我不得不从这里调用自己的函数)

C.h

编译时,我遇到了以下错误:

Implicit declaration of function 'ParseFile' is invalid in C99

谁能帮我解释一下哪里出了问题?这可能是由于循环引用不同的头文件(但我不能更改它,因为它会影响其他人的代码)。我怎样才能消除这个错误?非常感谢您的帮助!谢谢。

您需要在
C.m
中包含“A.h”。您正在
C.m
中调用
ParseFile()

将所有.m文件的扩展名重命名为.mm。通过这种方式,您可以在objective-C类中直接调用cpp函数,而无需任何包装。

首先,您需要从
C.h
C.m
中包含
A.h

但是,由于
A.mm
中定义的函数是使用(Obj)C++编译器编译的,因此可能需要使它们可以从C调用。可以使用。然后应该可以从C.m文件调用
ParseFile()
。例如,在头文件中:

extern "C"
{
   int ParseFile(const char *);
}

您是否在任何地方(例如从C.h或C.m)包括
A.h
?这是唯一定义
ParseFile
的地方。谢谢Lambda1,但我不能更改扩展名,因为它会影响其他人编写的代码。我能做什么呢?谢谢。但一旦我在C.m中包含了A.h,我就得到了架构i386的链接器错误未定义符号:“_ParseFile”,引用自:-[…这是我调用C.o中的ParseFile函数的地方ld:symbol未找到架构i386 clang:error:linker命令失败,退出代码为1(使用-v查看调用),谢谢Nathan,这似乎取得了一些进展。我添加了#ifdef uucplusplus extern“C”{#endif int ParseFile(char*filename);#ifdef ucplusplus}#endifThanks Nathan,这似乎取得了一些进展。我添加了#ifdef uucplusplus extern“C”{#endif int ParseFile(char*filename);#ifdef ucplusplus}#endif,当我编译时,我不再得到相同的错误。但是,它似乎弄乱了a.mm调用的cpp文件(D.cpp)中的名称空间(D.h包含在a.mm中)。我得到错误“将“”重新定义为不同类型的符号”,一些类名变成“未声明”--我得到“使用未声明的标识符xxxx”错误。你知道为什么会这样吗?我先看看D.cpp/D.h中使用的名称空间,看看是否与ParseFile或其他函数存在命名冲突。
#import "B.h"
#import "A.h"
.... (original codes in B.mm)
#import "C.h"
....
#import "C.h"
#import "B.h"
....
- (IBAction) call_my_proj: (id) sender
{
    ....
    ParseFile("myfile.txt");
}
.... (this file is un-changed)
Implicit declaration of function 'ParseFile' is invalid in C99
extern "C"
{
   int ParseFile(const char *);
}