【问题标题】:Link error with Objective-C++/C++ in XCode 4.2 Lion (iOS product)XCode 4.2 Lion(iOS 产品)中与 Objective-C++/C++ 的链接错误
【发布时间】:2011-11-04 07:11:44
【问题描述】:

我是 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
  • 那是名称剥离过程中的一个错误。我现在已经编辑它是正确的。

标签: ios xcode4 linker objective-c++


【解决方案1】:

对于您在此处引用的代码,您是否将 Market_Validate 重命名为 Validate?链接错误指的是前者,在给出的代码中是不存在的。

如果是这样,孤立的代码看起来是正确的,我怀疑在您显示的代码之外有什么地方出错了。确保两个 .mm 文件实际上都在编译和链接。检查两者是否包含与您的 Validate() 函数声明相同的头文件。由于您在将函数发布到此处之前已对其进行了重命名,因此请确保在整个代码中使用相同的名称(具体而言,声明和定义必须完全匹配)。

您是否在任何地方使用命名空间?如果声明不是,请确保您没有不小心将函数定义放入命名空间 - 它们将引用不同的函数。

请注意,您发布的代码无法编译,因为您的 struct Info 定义后缺少分号。一旦针对问题更改了代码而不测试该代码是否仍然存在问题,通常无法提供帮助。如果您仍然卡住,我建议您尝试修改此问题中的代码,以便编译并显示相同的链接错误。如果您无法重现它,请仔细查看您的“真实”代码和问题代码之间的差异。

【讨论】:

  • 感谢您的回复。我确实把示例弄乱了一点,但我主要担心我的模板和 Objective-C 的混合不符合规定。当我开始工作时,我会仔细检查其他位。
  • 我搞砸了。我没有将第二个 mm 文件添加到构建阶段。 XCode 新手 :) 再次感谢,伙计!
猜你喜欢
  • 1970-01-01
  • 2012-09-17
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
相关资源
最近更新 更多