【问题标题】:How to access pure Swift Static Library from pure Swift project?如何从纯 Swift 项目访问纯 Swift 静态库?
【发布时间】:2020-05-09 13:14:04
【问题描述】:

我在 Swift 中有一个静态库,我想从另一个 Swift 项目访问这个库类。无法正确引用库中的类。

我的名为StaticLib 的静态库包含层次结构,

静态库项目 - 层次结构

StaticLib (project)
   StaticLib 
       StaticLib.swift
   Products
       libStaticLib.a

静态库项目 - StaticLib.swift

public class StaticLib {

    public class func test(string: String) {
        Printer().printMe(string: string)
    }
}

class Printer {

    func printMe(string: String){
        print("This is test tring: \(string)")
    }
}

宿主应用 - AppDelegate.swift

import StaticLib

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {


        StaticLib.test("How do you do?") // error

        return true
    }
}

我已经完成的步骤 -

  1. 在 Xcode Project Navigator 中单击项目
  2. 点击+添加新目标
  3. 选择框架和库>静态库>下一步
  4. 输入名称StaticLib(在 Swift 中)> 完成
  5. 打开StaticLib.swift并输入
    public class StaticLib {

        public class func test(string: String) {
            Printer().printMe(string: string)
        }
    }

    class Printer {

        func printMe(string: String){
            print("This is test tring: \(string)")
        }
    }
  1. 选择StaticLib架构,构建>确定
  2. libStaticLib.a 复制到名为HostApp/Libs/ 的新文件夹中
  3. 在 Project Navigator 中选择项目 > 单击主应用程序目标 > 选择 General
  4. Framework、Libraries 和 Embedded Content 部分中单击我看到 libStaticLib.a 已由 Xcode 智能添加
  5. 选择主应用架构 > 构建 > 确定
  6. 选择 AppDelegate.swift > 添加import StaticLib
  7. 添加
    StaticLib.test("How do you do?")
  1. 尝试构建

编译错误:

使用未解析的标识符“StaticLib”

我该如何解决这个问题?我需要在库中创建任何头文件吗?

注意:我已成功嵌入libStaticLib.a,它出现在主机应用General -> Frameworks, Libraries and Embedded contents 标签中。

【问题讨论】:

  • 你在你的AppDelegate 中做了import StaticLib 吗?此外,test 函数也需要为 public
  • @DávidPásztor 当我import StaticLib 它给了No such module 'StaticLib'
  • 您是否已经尝试过How can I use a static library in Swift中的步骤
  • @david 我正在为纯 swift 主机应用程序使用纯 swift 库,所以我没有添加任何头文件。如果我需要库头的内容应该是什么?参考帖子也没有讨论我的情况。
  • @DávidPásztor 我已经公开了类函数。

标签: ios swift xcode frameworks static-libraries


【解决方案1】:

至少在 Xcode 11.3.1 / iOS 13.3 上,我已经通过了您的步骤和所有工作。唯一的……似乎……见评论

import StaticLib // << looks like you've forgot this one !!!

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {


        StaticLib.test("How do you do?") // error

        return true
    }
}

更新:这是我的步骤 -

  1. 在 Xcode Project Navigator 中单击项目
  2. 点击+添加新目标
  3. 选择框架和库>静态库>下一步
  4. 输入名称StaticLib(在 Swift 中)> 完成
  5. 打开StaticLib.swift并输入
    public class StaticLib {
        public class func printme() {
            print("I'm swfit static lib!")
        }
    }
  1. 选择StaticLib 架构,构建> 确定
  2. 在 Project Navigator 中选择项目 > 单击主应用程序目标 > 选择 General
  3. Framework、Libraries 和 Embedded Content 部分中单击 + 并选择 libStaticLib.a > Add
  4. 选择主应用架构 > 构建 > 确定
  5. 选择 AppDelegate.swift > 添加import StaticLib
  6. 在代码中的任意位置添加
    StaticLib.printme()
  1. 构建 > 确定 > 运行 ... 查看输出

Update2: 用于外部 Lib 项目

+1 需要将StaticLib.swiftmodule(与libStaticLib.a创建在同一位置)复制到目标项目文件夹中(我放在.xcodeproj文件级别)

+2 在主应用程序目标Build Settings 设置SWIFT_INCLUDE_PATHS = ${SRCROOT}

+3 清理 > 构建

注意:模块已加载的指示符是导入的自动完成 - 它应该显示 StaticLib

【讨论】:

  • 你是如何添加库的?拖放或移动到物理位置并参考它?你在构建设置中改变了什么吗?我收到错误。请参阅帖子中的评论。
  • 在第 8 步中,它不会显示 libStaticLib.a,除非我将其复制到主机应用程序的文件夹中。我需要这样做吗?但是,如果我复制库,它已经显示在常规选项卡中。请注意,库和主机应用程序不在同一个工作区中。我的 Xcode 版本:11.0 (11A420a)
  • 我已经用我已经完成的所有步骤更新了帖子。请看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
相关资源
最近更新 更多