我已经下载了最新版本的googles admob sdk.但是现在我在使用最新的sdk编译xcode 4.5时会遇到以下错误.
Undefined symbols for architecture i386:
"_OBJC_CLASS_$_ASIdentifierManager", referenced from:
objc-class-ref in libGoogleAdMobAds.a(GADIdentifierUtilities.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
什么可能是错的?
注意:"使用GHUnit"不是这个问题的可接受答案.我知道大多数人认为GHUnit比Xcode4 OCUnit更好,但这不是我所要求的.我会另外评估一下.
我有一个从头开始在Xcode4中创建的Xcode项目,在创建过程中选中了"Include unit tests"复选框.我还包括了我在之前项目中开发的一些库.它们通过"Add Files to x ..."对话框添加到项目中,并且仅添加到应用程序目标(而不是测试目标).它们在运行应用程序时工作正常,所以我认为它们设置正确.我还为这个项目编写了许多不同的类.
我的测试文件以标准方式设置,名为[AppName] Tests.h和.m.
标题代码:
#import < SenTestingKit/SenTestingKit.h >
@interface [AppName]Tests : SenTestCase {
@private
}
@end
Run Code Online (Sandbox Code Playgroud)
实施守则:
#import "[AppName]Tests.h"
@implementation [AppName]Tests
- (void)setUp
{
[super setUp];
// Set-up code here.
}
- (void)tearDown
{
// Tear-down code here.
[super tearDown];
}
// Test methods go here
@end
Run Code Online (Sandbox Code Playgroud)
这只是基本的骨架.它在我的其他项目中工作正常,并且在此项目中,只要我不导入任何其他文件.当我从该项目导入另一个文件并使用它时,我在Xcode输出日志中看到以下错误:
The test bundle at /Users/[Me]/Library/Developer/Xcode/DerivedData/[AppName]-dwuuuwcpmdqxqmgxomoniplwhlpb/Build/Products/Debug-iphonesimulator/[AppName]Tests.octest could not be loaded because a link error occurred. It is likely that dyld cannot locate a framework framework …
更新:我最终放弃并将GHUnit添加到我的项目中.我在几分钟内就开始使用GHUnit.
更新:您可以在此处下载Xcode项目:http://github.com/d11wtq/Cioccolata
我已经为我的Xcode项目添加了一个单元测试目标,但它在构建时找不到我的框架,说:
Test.octest could not be loaded because a link error occurred. It is likely that dyld cannot locate a framework framework or library that the the test bundle was linked against, possibly because the framework or library had an incorrect install path at link time.
我的框架(主项目目标)旨在嵌入,因此具有安装路径@executable_path/../Frameworks.
我已将框架标记为测试目标的直接依赖关系,并将其添加到"Link Binary with Libraries"构建阶段.
另外,我添加了"复制文件"的第一步(在它构建了依赖项之后),它只是将框架复制到单元测试包的Frameworks目录中.
有人有这方面的经验吗?我不确定我错过了什么.
编辑| 我很确定我不应该,因为框架不可执行,但我没有设置"测试主机"和"捆绑加载器".这应该(据我的理解)一切正常,因为测试包与框架链接并将像任何其他包一样加载它.
编辑| 我想我差不多了.我阅读了以下文章,该文章规定使用@rpath而不是@executable_path.
http://www.dribin.org/dave/blog/archives/2009/11/15/rpath/
在这种情况下,它非常有意义,因为OCUnit测试包不是可执行文件,它是一个普通的旧包,所以@executable_path不兼容.所以现在我的框架将其安装目录设置为@rpath,并且Test目标将其运行时搜索路径(rpath)定义为构建目录.这节省了我不得不将框架复制到测试包中,这意味着整个生成的框架本质上更灵活,因为它可以在任何地方生活.
现在,我也意识到我应该在Test目标上设置Bundle Loader,所以现在将其设置为框架二进制文件的路径.
我可以构建测试目标,我可以从框架中#import类,没有错误.但是一旦我尝试从框架中实例化一个类,我就会收到以下错误:
/Developer/Tools/RunPlatformUnitTests.include:412: note: Started tests for architectures 'i386'
/Developer/Tools/RunPlatformUnitTests.include:419: …
我将我的应用程序的名称从X更改为Y.它之前正在工作,但由于某种原因,它在执行新的拉动之后不再起作用.它给了我这个错误(来自YTests):
ld: file not found: <DerivedData Directory>/X.app/X
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
它正在寻找X.app而不是Y.app.我查看了构建设置,到处都是Y.app.它正在寻找测试中的错误文件.当我禁用测试时,我可以运行应用程序,但仍然会收到错误.有什么建议?
注意:我正在使用Xcode6-Beta5.