我是 Objective-C 的新手,对使用 C++ 和模板有点生疏,我不确定为什么会出现此链接错误。
我有一个头文件,其中包含类似于以下的定义:
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
我还有一个 .mm 文件,其中包含以下(全局)Validate() 方法的定义:
void Validate(InfoMap* infoMap)
{
[[InfoValidator getInstance] validate:infoMap];
}
当我从 C++ 类(在 .mm 文件中定义)调用 Validate() 时,我收到以下错误:
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
文件已添加到项目中,这是我遇到的唯一链接错误。感谢您的帮助。
最佳答案
您是否将此处引用的代码的 Market_Validate
重命名为 Validate
?链接错误指的是前者,给出的代码中不存在。
如果是这样,该代码单独看起来是正确的,我怀疑您所显示的代码之外有某些地方出错了。确保两个 .mm 文件实际上都在编译和链接。检查两者是否包含与您的 Validate()
函数声明相同的头文件。由于您在将函数发布到此处之前已重命名该函数,因此请确保您在整个代码中使用相同的名称(具体而言,声明和定义必须完全匹配)。
您是否在任何地方使用 namespace ?如果声明不是,请确保您没有不小心将函数定义放在命名空间中 - 它们将引用不同的函数。
请注意,您发布的代码无法编译,因为您的 struct Info
定义后缺少一个分号。一旦针对问题更改了代码,而没有测试该代码是否仍然存在问题,通常无法提供帮助。如果您仍然卡住,我建议您尝试修改此问题中的代码,以便编译并显示相同的链接错误。如果您无法重现它,请仔细查看您的“真实”代码和问题代码之间的差异。
关于ios - XCode 4.2 Lion(iOS 产品)中与 Objective-C++/C++ 的链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8005924/