2012-02-17 28 views
26

我有一個奇怪的鏈接器問題。我有一些代碼,看起來像這樣:鏈接器錯誤從Objective-C++調用C函數

double given_amount = self.modelController.levelCompleteRewardAmount; 
    swrve_currency_given(swrve, (CFStringRef)@"currencyName", given_amount); 

我在兩個不同的地方這樣的代碼:在Objective-C和一個Objective-C++文件。它編譯在Objective-C的土地罰款,但swrve_currency_given()函數導致我WGController.mm文件中的以下內容:

Undefined symbols for architecture armv7: 
    "swrve_currency_given(Swrve*, __CFString const*, double)", referenced from: 
     -[WGController giveTheUserSomeCashForPlayingThisLevel] in WGController.o 
ld: symbol(s) not found for architecture armv7 
collect2: ld returned 1 exit status 

我不能完全肯定這是否錯誤與給OBJ-C對比C++的東西,但它感覺喜歡它。我的理論是,它可能認爲它是Obj-C類的一個函數?該「swrve」代碼是第三方代碼,一個h和.c文件,我導入像這樣:

#import "swrve.h"

任何幫助表示讚賞! 感謝

+0

你還導入在項目中的鏈接?轉到目標的屬性,然後在摘要頁面上打開「鏈接的框架和庫」。 'swrve'圖書館應該在那裏;如果不是,請將其添加並再次嘗試編譯。 – dasblinkenlight 2012-02-17 20:07:39

+0

該庫不是一個靜態的lib/framework,它只是一個.c和.h文件。 (我已經更新了我的問題以反映這一點)。 – 2012-02-17 20:19:32

回答

45

您可能需要圍繞函數原型:

#if defined __cplusplus 
extern "C" { 
#endif 

void swrve_currency_given (...whatever goes here...); 

#if defined __cplusplus 
}; 
#endif 

這告訴,這是一個C函數,而不是C++函數編譯器。

+0

看起來像它的工作,但男孩,這是很多鍋爐板添加!謝謝! – 2012-02-17 20:24:47

+0

我已經使用'extern「C」'語法變體添加了一個不帶範圍的變體,我發現它更清潔一些,因爲您只需要執行一次樣板文件。對於評論來說有點太大了,但編輯應該很快就會獲得批准。 – pmdj 2012-02-19 12:21:49

9

如果您在C++文件中使用c函數。你應該使用extern "c"{}。 在h文件

#ifdef __cplusplus 
extern "C" { 
#endif 

swrve_currency_given(parameter1, parameter2, parameter3);// a c function 


#ifdef __cplusplus 
} 
#endif 

外部的「C」是指由C++編譯器來識別,並通知 用C 風格編譯編譯器所提到的功能是(或將要)。

如果您鏈接到編譯爲C代碼的庫。使用

extern "C" { 
    #include "c_only_header.h" 
} 

看看When to use extern "C" in C++?