2011-11-04 51 views
1

我是Objective-C的新手,在使用C++和模板時有點生疏,我不確定爲什麼我有這個鏈接錯誤。XCode 4.2 Lion中的Objective-C++/C++鏈接錯誤(iOS產品)

我有一個包含類似於這些定義一個頭文件:

struct Info { 
    std::string name; 
}; 

typedef std::map<std::string, Info> InfoMap; 

void Validate(InfoMap* infoMap); 

@interface InfoValidator : NSObject 
{ 
} 
+(InfoValidator*) getInstance; 
-(void) validate:(InfoMap*)infoMap; 
@end 

我也有一個包含了(全球)validate()方法的定義如下一個.mm文件:

void Validate(InfoMap* infoMap) 
{ 
    [[InfoValidator getInstance] validate:infoMap]; 
} 

當我打電話驗證()從一個C++類(在.mm文件中定義)時,收到以下錯誤:

Undefined symbols for architecture armv7: 
Validate(std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, Info, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, > std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, ?> std::allocator<char> > const, Info> > >*)", 
referenced from: 
     ItemInterface::ValidateItems(int, char const**)in iteminterface.o 
ld: symbol(s) not found for architecture armv7 
collect2: ld returned 1 exit status 

該文件已被添加到項目中,並且它是我得到的唯一鏈接錯誤。謝謝你的幫助。

+0

是的,它無法找到代碼中沒有的符號'Market_Validate'。 – trojanfoe

+0

這是名稱剝離過程中的錯誤。我已經編輯它現在是正確的。 – n8n8baby

回答

0

您是否將Market_Validate重命名爲Validate作爲您引用的代碼?鏈接錯誤是指前者,在給出的代碼中不存在。

如果是這樣,代碼看起來是正確的,我懷疑你顯示的代碼之外有什麼問題。確保兩個.mm文件實際上正在編譯和鏈接。檢查兩者是否包含與您的Validate()函數聲明相同的頭文件。由於您在此處發佈該函數之前已將其重命名,因此請確保在整個代碼中使用相同的名稱(具體而言,聲明和定義必須完全匹配)。

您是否在任何地方使用命名空間?確保你沒有意外地把你的函數定義放入一個名稱空間中,如果聲明不是 - 他們會引用不同的函數。

請注意,您發佈的代碼將無法編譯,因爲您的struct Info定義後缺少分號。一旦代碼被修改而不測試代碼仍存在的問題,通常不可能提供幫助。如果你仍然陷入困境,我建議試着修改這個問題中的代碼,以便編譯和顯示相同的鏈接錯誤。如果您無法複製它,請仔細查看「真實」代碼和問題代碼之間的差異。

+0

感謝您的回覆。我確實弄亂了這個例子,但我主要擔心我的模板和Objective-C的混合不是猶太教。當我開始工作時,我會仔細檢查其他位。 – n8n8baby

+0

我搞砸了。我沒有將第二個mm文件添加到構建階段。對Xcode很新穎:)再次感謝,隊友! – n8n8baby

+0

很高興你把它分類! – pmdj