2009-08-25 83 views
0

我想在我的应用程序中使用示例iPhone应用程序AQOfflineRenderTest的功能(此应用程序特别不重要,我只是认为它值得一提)。我有一个C++文件与方法调用:在可可iPhone应用程序中使用C++文件

void DoAQOfflineRender(CFURLRef sourceURL, CFURLRef destinationURL) 

我想从我的可可Objective-C类调用此。该示例应用我上面引用通过在头文件像这样声明方法做到这一点:

- (IBAction)doSomethingAction:(id)sender; 
    @end 
    void DoAQOfflineRender(CFURLRef sourceURL, CFURLRef destinationURL); 

在实现文件I调用它调用renderAudio并执行相同的代码doSomethingAction:

DoAQOfflineRender(sourceURL, destinationURL); 

当我执行我的错误: _DoAQOfflineRender”,从引用: - [myViewController renderAudio]在myViewController.o 符号(S)没有发现 collect2:LD返回1个退出状态

我是否缺少对此C++类的引用?它没有在示例应用中指定一个,但它运行。

请大家帮忙,谢谢!

+0

你有没有得到答案?我现在正在与它战斗....复制来自苹果的样本,并使用代码完全一样,因为他们在样本中,但得到的错误,它无法找到该符号... – 2009-12-24 16:45:48

+0

http://stackoverflow.com/questions/1956475/xcode-iphone-program-using-cpp-file-symbol-not-found – 2009-12-24 16:46:19

回答

1

什么你缺少的是DoAQOfflineRender实施 - 你忘了在这个例程定义链接到该库?

0

它看起来像你使用.m作为你的扩展名Objective-C源文件,所以编译器认为你引用了一个C函数。尝试将扩展名更改为.mm。

0

要从C或Objective-C文件调用C++函数,必须在C++中用extern "C"链接声明它。

#if __cplusplus 
extern "C" { 
#endif 

void DoAQOfflineRender(CFURLRef sourceURL, CFURLRef destinationURL); 

#if __cplusplus 
} 
#endif 

这样做的原因是,C++函数的名称被编码它们的类型修改,以便具有相同的名称,但不同的签名功能变得不同的符号。例如,DoAQOfflineRender(CFURLRef, CFURLRef)变成__Z17DoAQOfflineRenderPK7__CFURLS1_而不是extern "C",但是_DoAQOfflineRender与它一起,这就是C/Objective-C所期望的。

+0

这是否意味着你不能重载C++函数并将它们全部声明为'extern“C”'? – jtbandes 2009-08-25 17:55:43

+0

这是正确的。如果你想重载,使用'.mm'技巧将Objective-C文件转化为Objective-C++文件。 – 2009-08-25 18:30:18

+0

在以下示例中:http://developer.apple.com/iphone/library/samplecode/AQOfflineRenderTest/index.html使用C++类时未使用上述声明。他们是如何做到的呢? – Atma 2009-08-25 20:25:08

相关问题