【问题标题】:calling .cpp function in .m and .mm file, error在 .m 和 .mm 文件中调用 .cpp 函数,错误
【发布时间】:2014-01-13 05:04:24
【问题描述】:

我正在尝试将我自己的小型 cpp 项目集成到一个大型 Objective-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;
}

啊.h

int ParseFile(char* filename);

B.mm(原在大项目中)

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

B.h

#import "C.h"
....

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

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

C.h

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

当我编译时,我得到了这个错误:

Implicit declaration of function 'ParseFile' is invalid in C99

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

【问题讨论】:

  • 您是否在任何地方都包含A.h(例如来自 C.h 或 C.m)?这是定义ParseFile 的唯一位置。

标签: c++ objective-c mixing


【解决方案1】:

您需要在C.m 中输入#include "A.h"。您在C.m 中调用ParseFile()

【讨论】:

  • 谢谢。但是一旦我在 C.m 中包含了 A.h,我得到了链接器错误
  • 架构 i386 的未定义符号:“_ParseFile”,引用自:-[...这是我在 C.o ld 中调用 ParseFile 函数的地方:未找到架构 i386 的符号铿锵声:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
【解决方案2】:

首先,您需要包含来自C.hC.mA.h

但是,因为A.mm 中定义的函数是使用 (Obj)C++ 编译器编译的,所以您可能需要使它们可以从 C 中调用。您可以使用 C linkage 执行此操作。然后ParseFile() 应该可以从 C.m 文件中调用。比如在头文件中:

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

【讨论】:

  • 感谢 Nathan,这似乎取得了一些进展。我添加了#ifdef __cplusplus extern "C" { #endif int ParseFile(char * filename); #ifdef __cplusplus } #endif
  • 感谢 Nathan,这似乎取得了一些进展。我添加了#ifdef __cplusplus extern "C" { #endif int ParseFile(char * filename); #ifdef __cplusplus } #endif 并且当我编译时我不再得到相同的错误。但是,它似乎弄乱了 A.mm 调用的 cpp 文件 (D.cpp) 中的命名空间(D.h 包含在 A.mm 中)。我收到错误“将 '' 重新定义为另一种符号”,并且一些类名变成“未声明”---我收到“使用未声明的标识符 xxxx”错误。你知道为什么会这样吗?
  • 我会先查看 D.cpp/D.h 中使用的命名空间,看看是否与 ParseFile 或其他一些函数存在命名冲突。
【解决方案3】:

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

【讨论】:

  • 感谢 Lambda1,但我无法更改扩展,因为它会影响其他人编写的代码。我能做什么呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
相关资源
最近更新 更多