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

用户名

我想在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)

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

提前致谢。

谢尔盖·卡里尼琴科(Sergey Kalinichenko)

当您编写此前向声明时,

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;

在应用程序委托文件中:

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

您API的用户将不得不编写ptrApiResponse->A而不是ApiResponse.A,但是编译器将能够强制保持一致性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

链接到可执行文件时,如何强制将目标文件包含在静态库中?

将头文件包含到静态库中

编译过程中未包含在目标中的.h文件会发生什么情况?

如何仅将JavaScript库包含在create-react-app的生产构建文件中?

如何将.rb文件中的代码正确包含到Rails体系结构中?

如何将脚本单独包含在我的构建文件夹中?

如何将xlsx文件作为数据包含在R包中

将静态文件包含在可重用的Razor类库中

克隆git存储库,并将所有者包含在文件夹结构中

CMake configure_file未包含在静态库中

我如何将SASS mixin包含在变量中?

如何将分配给结构数组的结构包含在C中的结构中?

如何将Hy代码包含在单独的文件中,然后使用Hy导入该代码?

将静态属性包含在存储库中可以吗,或者这是一种不好的做法?

如何使用Ant构建将Maven依赖库包含在war文件中

PHP:将库包含在不同目录中的文件中

如何将文件同时包含在cpp中作为字符串和代码?

如何将jar文件包含在Scala代码中

如何将正则表达式包含在词汇无赖结构中?

我应该如何包含在我的静态库中?

将仅包含头文件的库包含在单个 cpp 文件中

访问包含在 Python 模块中的静态文件

如何将这个 svg 包含在 react 组件中?

将 Boost 标头包含到 .h 文件中但不包含在 .cpp 文件中时发生错误

ExpressJS:如何将转译的 .js 文件作为静态资源包含在 HTML 中

如何将您的 github 存储库包含在 gradle 依赖项中

CMake 项目结构:如何将库正确合并在一起并将它们包含在多个可执行文件中

包含在 2 个 gtest 文件中的静态内联关联集合引发读取访问冲突

如何将数字[] 匹配仅包含数字的接口