如何将包含结构的.h文件仅包含在静态库中

时间:2013-12-26 10:31:09

标签: ios objective-c static-libraries

我想在Objective C iOS中创建一个静态库。但是我想在.h文件中只定义结构。不会有任何.m文件文件。

struct ApiResponseStruct
{
    __unsafe_unretained NSString * const A;
    __unsafe_unretained NSString * const B;
    __unsafe_unretained NSString * const C;
    __unsafe_unretained NSString * const D;
};

extern const struct ApiResponseStruct ApiResponse;

所以,当我创建我的静态库并将其包含在演示应用程序中时。它始终显示我链接器错误。

Undefined symbols for architecture armv7:
  "_ApiResponse", referenced from:
      -[TestLib setApiResponse] in libTestLib.a(TestLib.o)
      -[TestLib getApiResponse] in libTestLib.a(TestLib.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

所以,有人可以帮我解决这个问题。

先谢谢。

1 个答案:

答案 0 :(得分:2)

当你写这个前瞻声明时,

extern const struct ApiResponseStruct ApiResponse;

您保证编译器在您的某个文件中存在ApiResponse的非静态定义。看来你的.m文件都没有提供这个定义,所以链接器抱怨ApiResponse未定义。

添加

const struct ApiResponseStruct ApiResponse;

到你的.m或.c文件中。它可能在您的库或您的应用程序中,但它需要存在才能使您的项目正确编译。

  

如何为ApiResponse.A = @“String”分配值?我尝试时遇到错误。

您收到错误,因为您尝试在静态上下文中分配它。您需要在运行时进行分配,例如,从应用程序委托的application:didFinishLaunchingWithOptions:方法进行分配:

// Define your struct outside the method
struct ApiResponseStruct ApiResponse;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ... // Your regular "didFinishLaunchingWithOptions' code...
    ApiResponse.A = @"Quick";
    ApiResponse.B = @"Brown";
    ApiResponse.C = @"Fox";
    ApiResponse.D = @"Jumos";
    return YES;
}

您将无法保留此const,因为无法为NSString*字段提供有意义的静态初始化。您应该将标题更改为此

extern struct ApiResponseStruct ApiResponse;

或使用不同的方法:指向ApiResponseconst的指针,并将其静态指向非const struct,如下所示:

extern const struct ApiResponseStruct *ptrApiResponse;

在app委托文件中:

struct ApiResponseStruct ApiResponse;
const struct ApiResponseStruct *ptrApiResponse = &ApiResponse;

您的API用户必须编写ptrApiResponse->A而不是ApiResponse.A,但编译器将能够强制执行常量。