gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:08:44 26 4
gpt4 key购买 nike

我想在 iOS 的 Objective C 中创建一个静态库。但是我只想在 .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)

那么,有人可以帮我解决这个问题吗?

提前致谢。

最佳答案

当你写这个前向声明时,

extern const struct ApiResponseStruct ApiResponse;

您向编译器保证您的某个文件中有 ApiResponse 的非静态定义。您的 .m 文件似乎都没有提供此定义,因此链接器提示 ApiResponse 未定义。

添加

const struct ApiResponseStruct ApiResponse;

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

How do I assign a value to ApiResponse.A = @"String"? I get an error when I try it.

你得到一个错误,因为你试图在静态上下文中分配它。您需要在运行时进行分配,例如,从应用程序委托(delegate)的 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;

在应用委托(delegate)文件中:

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

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

关于ios - 如何将仅包含结构的 .h 文件包含到静态库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20783272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com