【问题标题】:Create and use swift static library in Xcode 10.1在 Xcode 10.1 中创建和使用 swift 静态库
【发布时间】:2019-01-16 23:17:10
【问题描述】:

我打算创建 swift 静态库并在 ios swift 应用程序中使用。我创建了一个名为 SimpleLib 的快速静态库,它包含一个返回 Hello World 字符串的公共类 Greeting:

//
//  Greeting.swift
//  SimpleLib
//

import Foundation

public class Greeting {
   public func Hello() -> String {
     return "Hello World";
   }
   public init() {

   }

   public static func SayMorning() -> String{
      return "Hi, Morning";
   }
}

swift静态库项目如下:

module.modulemap 定义如下:

module SimpleLib {
  header "SimpleLib-Swift.h"
  export *
}

我构建并生成了一个 libSimpleLib.a 文件,我将 .a 和其他文件(互联网上的其他帖子提到需要放在 app 文件夹中)放在 app 文件夹中:

在应用程序项目中,我在 FREAMEWORK_SEARCH_PATHS、LIBRARY_SEARCH_PATHS 和 HEADER_SEARCH_PATHS 中包含 Libs 路径,并在 Linked Framework 中包含 .a 文件

但是,当我尝试在 AppDelegate 中引用 Greeting 类时,出现错误 - Use of unresolved identifier 'Greeting'

//
//  AppDelegate.swift
//  testStatic
//

import UIKit
import SimpleLib


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

   var window: UIWindow?

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
      // Override point for customization after application launch.
      var s = Greeting
      return true
   }
 ......
 }

如何在静态库中制作Swift对象可以参考App。在 swift 静态库中导出类/函数的正确步骤是什么? 有人成功在 iOS 应用中构建和使用 swift 静态库吗?

【问题讨论】:

  • 你应该复制你的代码而不是发布截图。屏幕截图不能作为文本进行操作,这会导致很多问题。阅读您的问题的人无法复制您的代码进行尝试,依赖屏幕阅读器的人无法知道您的代码是什么。
  • 我在帖子中更新并复制了我的代码。希望它可以帮助理解我的问题

标签: ios swift static-libraries xcode10.1


【解决方案1】:

在应用的SWIFT_INCLUDE_PATHS 设置中包含您的module.modulemaparm64.swiftmodule 路径。

【讨论】:

    【解决方案2】:

    问题是您的类与您的模块同名。尝试simple.simple() 创建您的类的实例,或者重命名模块或类。

    【讨论】:

    • 对不起,没用。
    【解决方案3】:

    确保将 .a 库和相关的 .swiftmodule 从构建产品添加到应用文件。然后在“Linked Framework and Libraries”中链接 .a 库,同时确保它出现在“Link Binary with Libraries”的 Build Phases 中。

    最后在构建设置中,在“Swift 编译器 - 搜索路径”>“导入路径”下添加 .swiftmodule 文件夹的路径。路径是相对于 .xcodeproject 的。

    确保您使用的类和方法是公开的或公开的。

    【讨论】:

      【解决方案4】:

      这是在 Objective-C 中创建静态库和在 swift 应用程序中创建 Access 的方法。请按照以下步骤操作。

      如何在 Swift 示例代码库中导入 Objective-C 静态库项目文件进行调试。

      步骤 1. 将完整的 SDK 源代码复制粘贴到示例项目目录中

      步骤 2. 在示例代码中添加静态库项目文件。

      步骤 3. 添加库 (TestStaticLib.a) 依赖和所需的 C++ 库或 curl 或伐木工人框架等

      选择目标-> 构建阶段-> 添加库和框架。

      步骤 4. 链接依赖

      选择 + 并添加通用库依赖项。

      步骤 6. 设置库 .h 文件的标头搜索路径

      选择目标->构建设置->标头搜索路径

      把你的库路径像“$(SRCROOT)/ConnectSDKApp/TestStaticLib”

      步骤 7. 编译通用库

      单独打开库目标并编译通用库。

      一旦编译完成。签入通用文件夹中的库路径,无论是否创建了 .a 文件。

      如果创建良好。否则,检查为什么它没有被创建。 .a 通过脚本创建的文件。在

      库通用目标 -> 构建阶段和运行脚本。

      如果未创建 .a 文件,则无需示例代码。它不会编译未创建的单元 .a 文件。

      常见问题解答。

      1. 无法找到您在桥头中链接的头文件的 .h 并尝试如下访问。

      进口

      进口

      答案。您没有链接正确的标题搜索路径。请检查步骤并设置正确的标题搜索路径。

      1. 缺少链接器错误 ServiceManager 目标 C 类。

      答案。通用库第 4 步的链接依赖关系

      问题 3. 应用程序崩溃……因为这个原因

      原因:'*** -[__NSDictionaryM setObject:forKey:]: 对象不能为 nil (key: com.hac.mapService.TomTom)'

      答案。

      问题 4. Universal .a 文件在构建成功后未创建。

      答案。检查脚本可能是脚本有问题。

      问题5.脚本有什么用。

      答案。创建设备和模拟器编译所需的通用库所需的脚本。

      TestStaticLib.a 文件仅在使用设备和模拟器架构创建时为设备和模拟器同时编译。

      想要访问您项目中的 .a 静态文件。

      第 1 步。在您的示例代码中添加通用库 (TestStaticLib.a),它将为模拟器和设备编译

      步骤 2. 添加库 (TestStaticLib.a) 依赖和所需的 C++ 库或 curl 或伐木工人框架等

      选择目标-> 构建阶段-> 添加库和框架。

      步骤 3. 在 Bridge header 中导入 .h 文件

      编译。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-18
        • 2014-09-28
        • 2011-12-07
        • 1970-01-01
        • 1970-01-01
        • 2012-03-19
        • 1970-01-01
        相关资源
        最近更新 更多