【问题标题】:Google Cloud Endpoints linking iOS client issuesGoogle Cloud Endpoints 链接 iOS 客户端问题
【发布时间】:2013-05-03 02:54:58
【问题描述】:

这个问题源于我不完全了解 iOS 中的静态库,而且来自 google 的文档似乎有点稀疏。

我正在尝试将 Google Cloud Endpoints 用于我的移动后端。

我为我的客户端库生成 .m 和 .h 文件。然后我创建了一个新项目(OwnItApi),将 libGTLTouchStaticLib.a 静态库从 GTL.proj 拖到这个新项目中。然后我将生成的文件 .m 和 .h 文件添加到这个项目中。我将所有 .m 文件添加到编译源,然后将头文件复制文件。在构建设置中,我将“-ObjC -all_load”添加到其他链接器标志项。

更新:我忘了提到我还从 GTL.proj 复制了头文件到 OwnItAPI 项目。这些包括文件 GTLBase64.h、GTLBatchQuery.h、GTLBatchResult、h 等。我想我必须这样做,因为没有它们,构建会失败。

如果没有标题,我会得到:错误“'GTLObject.h'file not found”。在导入语句上。

然后我把这个项目生成的静态库添加到我的目标是一个 iphone 应用程序的主项目中。为了测试 API 是否正常工作,我将其添加到 App Delegate

#import "OwnItApi/GTLServiceOwnit.h"
#import "OwnItApi/GTLQueryOwnit.h"
#import "OwnItApi/GTLOwnitApiBrands.h"

这是在应用程序内部:didFinishLaunchingWithOptions: function

static GTLServiceOwnit *service = nil;
if (!service) {
    service = [[GTLServiceOwnit alloc] init];
    service.retryEnabled = YES;
    [GTMHTTPFetcher setLoggingEnabled:YES];
}

GTLQueryOwnit *query = [GTLQueryOwnit queryForBrandsListWithUserID:@"venkat"];
[service executeQuery:query completionHandler:^(GTLServiceTicket *ticket,    GTLOwnitApiBrands *object, NSError *error) {
    NSArray *items = [object brands];;
    NSLog(@"%@", items);
}];

当我编译时,我会收到类似这样的重复错误:

duplicate symbol _OBJC_METACLASS_$_GTLOwnitApiBrand in:
/Users/vrao/Library/Developer/Xcode/DerivedData/Own_It!-ertvnctptaddricdrjyrmgemzgsh/Build/Products/Release-iphoneos/libOwnItApi.a(GTLOwnit_Sources.o)

17 个类似的错误。然后终于

clang: error: linker command failed with exit code 1 (use -v to see invocation)

更新: 在 GTL 项目中,libGTLTouchStaticLib.a 在我构建后是红色的,当我右键单击它时,“在 Finder 中显示”显示为灰色。为了找到 .a 文件,我对“GTL.framework”使用“在 Finder 中显示”,然后返回文件夹找到 libGTLTouchStaticLib.a。

【问题讨论】:

  • 你能列出你添加到项目中的全部文件吗?
  • @DanHolevoet 感谢您的回复。我已将我的项目添加到 github,这里:github.com/vrao423/OwnItAPI。我还将编辑我的原始回复。

标签: ios google-app-engine google-cloud-endpoints


【解决方案1】:

我相信您看到了您所看到的问题,因为您还包含了 GTLOwnit_Sources.m 文件。您可以从包含的文件列表中省略它。

【讨论】:

  • @DanHalevoet 就是这样。为什么会生成这个文件?
  • 为了方便起见,我猜它是替代品。请参阅文件顶部的注释:“此文件可以编译成项目以避免为此服务添加单独的源文件。”
  • 将它添加到编译源而不是所有文件是有意义的。然后,当我重新生成我的客户端文件时,我不必进行很多更改。你们有没有考虑让服务生成器创建一个静态库而不仅仅是文件?我还需要将头文件复制到 API 项目吗?这似乎有点不对劲。
猜你喜欢
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多