2009-08-25 89 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

相關問題