我想在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)
所以,有人可以帮我解决这个问题。
先谢谢。
答案 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;
或使用不同的方法:指向ApiResponse
和const
的指针,并将其静态指向非const struct
,如下所示:
extern const struct ApiResponseStruct *ptrApiResponse;
在app委托文件中:
struct ApiResponseStruct ApiResponse;
const struct ApiResponseStruct *ptrApiResponse = &ApiResponse;
您的API用户必须编写ptrApiResponse->A
而不是ApiResponse.A
,但编译器将能够强制执行常量。