3

我计划创建 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 静态库吗?

4

4 回答 4

3

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

于 2019-01-25T07:09:30.330 回答
0

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

于 2019-01-16T23:48:41.630 回答
0

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

最后在构建设置中,在“Swift Compiler - Search Paths”>“Import Paths”下添加 .swiftmodule 文件夹的路径。路径是相对于 .xcodeproject 的。

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

于 2019-10-02T19:22:24.410 回答
-1

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

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

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

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

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

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

步骤 4. 链接依赖

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

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

选择target-> Build Setting-> Header Search Path

把你的库路径放在“$(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. 通用 .a 文件在构建成功后未创建。

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

问题5.脚本有什么用。

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

当使用设备和模拟器架构创建时,TestStaticLib.a 文件仅针对设备和模拟器同时编译。

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

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

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

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

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

编译。

于 2020-01-29T16:47:38.673 回答