【发布时间】:2011-04-01 13:35:52
【问题描述】:
我正在将一个相当大的代码库移植到 iOS。我的场景的简化版本如下:
- 我有一个从命令行构建的 C++ 库。我可以从 iOS 模拟器运行它的代码,所以我相信它是正确构建的。
- 我有 Xcode 创建的骨架 iOS 应用程序
我想将日志记录添加到 C++ 库。我有一个采用fmt, ... 的trace() 方法。我使用-x Objective-c++编译那个.cpp,代码如下:
void trace (const char* sFmt, ...)
{
va_list args;
va_start(args, sFmt);
NSString* sFmt2 = [ NSString stringWithUTF8String: sFmt ];
NSLogv(sFmt2, args);
va_end(args);
}
库编译得很好。但是,当我尝试链接应用程序时,出现链接器错误:
".objc_class_name_NSString", referenced from: literal-pointer@__OBJC@__cls_refs@NSString in lib.a(trace.o)
这很奇怪,因为我可以在项目本身的 .mm 文件中使用 NSString 和 NSLog。 Foundation 框架是链接的。此外,只是为了测试,我没有从我的库中调用 NSString,而是在项目中的 .mm 中添加了一个帮助器 foobar(),它会这样做
void foobar (const char* sFmt)
{
NSLog([NSString stringWithUTF8String:sFmt]);
}
当从上面的库函数中调用它时,它可以工作!
我读到的关于这种错误的所有内容都涉及“刚刚更新了我的 SDK”的场景,这不是我的情况。两天前我开始做 iOS 的东西,我没有更改默认项目设置等。
我的猜测是名称修饰在某些时候失败了,因为我知道 NSString 确实是链接的,但似乎库引用的名称与链接的名称不同。
有什么想法吗?
【问题讨论】:
标签: c++ objective-c xcode