【问题标题】:Why do I get iOS linker errors with my static libraries?为什么我的静态库会出现 iOS 链接器错误?
【发布时间】:2019-03-03 07:59:06
【问题描述】:

我在将混合语言框架链接到项目时遇到问题。

  1. 我用 Swift 和 Objective-C 类创建了一个框架。

  2. 主要逻辑存储在 Swift 文件中。例如具有调用 NSLog("Swift log was called") 的方法的类。

  3. Objective-C 文件有一个类,该类有一个方法,我在其中创建 Swift 类的实例并调用 Swift-log 方法。

  4. 我将这个框架与我的 Objective-C 项目链接,我可以调用这个项目中我需要的所有东西,但是当我想构建这个项目时,我收到错误 linker command failed with exit code 1 (use -v to see invocation)

    还有警告:

ld: warning: Could not find auto-linked library 'swiftFoundation'
ld: warning: Could not find auto-linked library 'swiftDarwin'
ld: warning: Could not find auto-linked library 'swiftCoreFoundation'
ld: warning: Could not find auto-linked library 'swiftCore'
ld: warning: Could not find auto-linked library 'swiftCoreGraphics'
ld: warning: Could not find auto-linked library 'swiftObjectiveC'
ld: warning: Could not find auto-linked library 'swiftDispatch'
ld: warning: Could not find auto-linked library 'swiftSwiftOnoneSupport'

我也看到了导入空 Swift 文件的解决方案,但是需要制作一个没有任何垃圾的项目。

【问题讨论】:

  • @PhilipPHolly 我需要一个不包含空文件的解决方案。
  • 很抱歉,到目前为止我还没有找到任何解决方案。如果你发现了什么,请告诉我。
  • 嗨,有什么解决方案吗?

标签: ios objective-c swift static-libraries static-linking


【解决方案1】:
  1. 在 Xcode 中打开 ios/YourAppName.xcodeproj
  2. 在左侧的 Project Navigator 中右键单击 Your App Name,然后单击 New File…
  3. 为项目创建一个空的 Swift 文件(确保在添加时选择了 Your App Name 目标)
  4. 当 Xcode 询问时,按 Create Bridging Header 然后不要删除 Swift 文件。 重新运行您的构建。

这应该可以解决问题

【讨论】:

  • 如果我已经有一个现有的桥接头并且问题仍然存在怎么办?我正在运行 MacOS MojaveXCode 11.3.1
  • 如果你已经有桥接文件怎么办,请有人解释一下
  • Xcode 不询问“创建桥接头”,Xcode 版本:12.4
【解决方案2】:

在我的例子中,它是一个在添加 Swift Pods 库后的 React-Native 项目。也许只有第 2 步可以工作:

  1. 添加新的 Swift 文件和 Brigde 标头:

1) File -> New -> File

2) 选择Swift File

3) 确认Create Bridging Header

  1. 转到Build Settings 并将Always Embed Swift Standard Libraries 设置为YES

【讨论】:

  • 我会将文件放在哪里,在 pod 或项目下?
  • @lutakyn 我已经把它放在项目里了
  • 在创建桥接文件后不要删除虚拟 Swift 文件!保留它或构建失败
  • Step Create Bridging Header 没有出现在我面前。它对我来说是Save File
  • @dcangulo 仅当您的文件名包含“bridging-header”时才会显示该步骤
【解决方案3】:

显然,对于纯 Objective-c 项目,您需要将此 $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) 添加到目标的库搜索路径。当我将一个用swift编写的库包含在objective-c中的项目中时,这对我有用

【讨论】:

  • 这很完美!对于任何想知道如何做到这一点的人;在文件资源管理器中单击您的 xcode 项目 -> 在 Targets 下选择您的目标 -> 选择 Build Settings 选项卡 -> 搜索 Library Search Paths 并将 $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) 添加到调试和发布部分。
  • 不幸的是,当使用带有 Xcode 10.2 的 Swift 5 时,这个技巧似乎已经停止工作 - 可能是因为现在有 iOS 12.2 的系统范围的 Swift 库。
  • 对于那些刚接触 Xcode 的人,请确保选择“全部”并且是蓝色的,否则您可能找不到库搜索路径
  • 尝试将以下内容添加到目标的库搜索路径中:$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)
  • 它可以编译,但在启动应用程序时我遇到了崩溃:“libswiftCore.dylib 的此副本需要 12.2.0 之前的操作系统版本”。如果你想解决它,只需在项目中添加一个空的 swift 文件,永久保存它就可以工作。 (问题在于您在应用程序中同时使用了objective-c 和swift 代码)
【解决方案4】:

对于 XCode 11 beta 4 库搜索路径应该是:

$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)

【讨论】:

  • 我必须将此添加到我的每个目标库搜索路径属性中。不仅仅是主应用程序。所以,包括我的手表套件和 Siri Intents 目标。
  • 任何带有 Swift 代码的目标都需要具有上述 XCode 11 的路径
  • 请注意,如果你在 Xcode 12 中仍然有这个,它可以 f* 你的构建。]\
【解决方案5】:
  1. 右键项目名称,添加一个新的swift文件,保留为File.swift
  2. 它会要求您创建一个新的桥接头接受
  3. 再次运行项目

【讨论】:

    【解决方案6】:

    我已经导出了我的统一项目。早些时候,它只是通过按创建桥接头添加空的 swift 文件。

    但最近我已将我的 xCode 更新到 12.3 并且它停止工作。

    所以,尝试了其他一些方法。

    我已将 $(SDKROOT)/usr/lib/swift 添加到构建设置 > 搜索路径 > 库搜索路径。

    但它仍然不起作用。所以,我添加了相同的路径,即构建设置 > 搜索路径 > 库搜索路径。

    $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)

    $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)

    现在它运行完美。没有得到确切的问题或解决方案,但这种方式效果很好。

    我只是在构建设置>搜索路径>库搜索路径中添加这三个。

    1. $(SDKROOT)/usr/lib/swift
    2. $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)
    3. $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)

    另外TOOLCHAIN_DIR 目录不起作用。如果我添加$(SDKROOT)/usr/lib/swift 那么只有它起作用。

    【讨论】:

    • 在 Xcode 12.5 中测试,$(SDKROOT)/usr/lib/swift 需要是第一个
    • 谢谢,它适用于 Xcode 13.1
    【解决方案7】:

    试试这个解决方法https://stackoverflow.com/a/50495316/1658268

    基本上只需在您的项目中添加一个虚拟 swift 文件,然后重新运行您的构建。

    【讨论】:

    • 你是第二个提出这个解决方案的人:)。正如我在 cmets 中对我的问题的描述所说,我需要没有空 Swift 文件的解决方案。
    【解决方案8】:

    如果您在将 xCode 更新到版本 12 后遇到问题并出现错误

    无法找到或使用自动链接库“swiftWebKit”

    还有两个。

    只需将$(SDKROOT)/usr/lib/swift 添加到构建设置 > 搜索路径 > 库搜索路径

    希望它的帮助:)

    【讨论】:

    • @SehiiVolynets,路径请使用斜体(使用*括号)。
    • @maciejwww,“斜体”和“星号括号”是什么意思?应该使用哪一个?
    • 我的意思是 StackOverflow 上的格式化策略。使用星号括号将文本格式化为斜体:*text* --> text。对于 GUI 中的路径,建议使用 italicsbold(双星号:**text**)字体。但是,我想在这种情况下使用 bold 字体比使用 italics 字体更好。现在,不再需要我的评论,因为@Niko 已经编辑了你的答案。检查并与您的版本进行比较。有关文本格式化的简短信息和示例,您可以找到 here
    • 为我工作!感谢 Xcode 12.5 iOS 14.5
    【解决方案9】:

    Xcode 12.5,React Native。

    更改:“库搜索路径”从 Swift-5.0 到 Swift-5.2

    【讨论】:

    • 嘿,非常感谢!将库搜索路径从 swift-5.0 更改为 swift-5.2 使我的应用程序最终构建并运行(它与手表应用程序或小部件无关)。
    【解决方案10】:

    如果您的 Xcode 版本 >=12.2

    前往

    BuildSettings -> 链接 -> 运行路径搜索路径

    并添加/usr/lib/swift 作为您的第一个参数,如下所示:

    【讨论】:

    • 谁能解释一下为什么是-1?因为我尝试了这个,现在我不再需要在更改单行时不断地清理 => 重建。注意:我还需要将“启用位码”设置为“否”
    • 对我来说工作得很好,非常感谢!!
    【解决方案11】:

    在使用 Xcode 首选项 » 组件 » 工具链中配置的 Swift 5.0 快照意外编译项目时,我遇到了同样的错误。

    【讨论】:

    • 我故意改了...有什么办法可以在 arm64 上编译(在模拟器上可以正常工作)?
    【解决方案12】:

    XCode 11.3 测试版,Swift 5.0

    我只是将我的目标添加到 podfile:

    platform :ios, '9.0' 
    use_frameworks! 
    inhibit_all_warnings!
    
    def shared_pods
        # Pods for NamaIOS
        pod 'Alamofire'
        pod 'RxSwift'
    end
    
    target 'MyApp' do
      use_frameworks!
    
      shared_pods
    
    end
    
    target 'MyApp-Test' do
      use_frameworks!
    
      shared_pods
    
    end
    
    target 'MyApp-Development' do
      use_frameworks!
    
      shared_pods
    
    end
    

    【讨论】:

      【解决方案13】:

      如果您来自 lottie-react-native install instructions,只需将 use_frameworks! 添加到 podFile #536 (comment)

      【讨论】:

        【解决方案14】:

        如果您在结合使用 Xcode 11 beta 4 和 carthage 时遇到此错误,请参阅以下解决方法:

        https://github.com/Carthage/Carthage/issues/2825

        基本上它包括创建一个带有修复程序的 xcconfig 并将它们注入到每个构建中。

        【讨论】:

          【解决方案15】:

          我只是忘记将新框架添加到我的 pod 文件中 :)

           target 'Data' do
          inherit! :search_paths
           pod 'AlamofireObjectMapper', '~> 5.2'
          

          结束

          【讨论】:

            【解决方案16】:

            对于 Xcode 12.2

            使用 Xcode 创建一个 Empty Swift 文件,例如命名为 Void.swift,每个问题都会由 Xcode 自动解决。

            【讨论】:

              【解决方案17】:

              我在我们的项目中遇到了这个问题,问题是我们的 xcode 项目文件中存在对 lottie 的孤立引用。在文本编辑器中打开它并删除它们为我解决了这个问题。

              【讨论】:

                【解决方案18】:

                当我尝试将 Lottie 集成到我的 React Native 项目中时,解决这个问题的方法是使用 npm 卸载 lottie-ios 和 lottie-react-native 模块。

                npm uninstall lottie-react-native lottie-ios
                

                确保文件也被取消链接

                npx react-native unlink lottie-react-native lottie-ios
                

                我的项目中也有桥接文件,之前尝试过该方法但没有成功,因此为了复制我的流程,请按照建议的答案将该文件也添加到您的项目中。

                在这些步骤之后,我继续删除了我的 Pods 文件夹,从 xcproject 和 xcworkspace 清理了我的构建(也许其中一个就足够了)。 之后我又继续安装了模块

                npm i --save lottie-react-native lottie-ios@3.1.3
                

                (请务必在 lottie 存储库中查看当前停靠点以获取最新版本。)

                重新安装模块后,cd 进入 ios 文件夹并运行 pod install。

                在 Xcode 中打开您的 xcworkspace 并运行您的项目(确保您的构建是干净的)。

                这解决了我的问题。

                祝你好运。

                【讨论】:

                • 你安装的 lottie-react-native 版本
                • 您好@AftabAmin,感谢您的反对?。如果您阅读我的帖子,您会看到我在 lottie RN 文档上关注文档:github.com/lottie-react-native/lottie-react-native 在一年前发布此内容时,我不太确定版本,但可以使用最新的稳定版本.祝你好运!
                • 我已经尝试了所有更新版本,但没有工作。当我删除这些库时,它工作正常。两个月后,我的应用程序开始运行。今天我正在更新我的应用程序,突然遇到了这个问题。一个月前也遇到过这个问题,但后来我解决了。
                • @AftabAmin 我明白了,这太糟糕了。让lottie RN 的开发人员知道这一点,或许可以打开一个贯穿问题。可能帮助的人比自己多。可惜我帮不上忙了。自从我和洛蒂一起工作以来已经有一段时间了。
                猜你喜欢
                • 2018-12-11
                • 1970-01-01
                • 2013-01-20
                • 2023-03-29
                • 1970-01-01
                • 1970-01-01
                • 2019-02-17
                • 1970-01-01
                相关资源
                最近更新 更多