为什么链接器将静态库与错误链接?的iOS


75

将混合语言框架链接到项目时出现问题。

1)我创建了一个包含Swift和Objective-C类的框架。

2)主要逻辑存储在Swift文件中。例如,该类具有调用NSLog(“ Swift log was created”)的方法。

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文件的解决方案,但是必须创建一个没有任何垃圾的项目。


4
我发现这解决了我的问题:stackoverflow.com/a/50495316/2842800
phips28 '18

@PhilippHolly我需要一个不包含空文件的解决方案。
Yaroslav Skachkov '18

抱歉,到目前为止,我还没有找到任何解决方案。让我知道你是否发现了什么。
phips28 '18 -10-2

Answers:


137
  1. 在Xcode中打开ios / YourAppName.xcodeproj
  2. 在左侧的项目浏览器中,右键单击您的应用程序名称,然后单击新建文件…。
  3. 为项目创建一个空的Swift文件(添加时请确保选择了“您的应用名称”目标)
  4. 当Xcode询问时,按Create Bridging Header,然后不删除Swift文件。重新运行您的构建。

这应该解决问题


7
是,使用这个,如果你用斯威夫特5 / Xcode的10.2 /的Mac OS 10.14.4 / iOS版12.2.2有问题
马克Sergienko

2
难以理解……我什至不知道这确实做了什么,但是我尝试了一下,并解决了我的问题。斯威夫特5 / Xcode的10.2 /的Mac OS 10.14.6
威尔

这对我有用。MacOS Catalina 10.15.2 XCode 11.3.1RN0.61.5
Yeshan Jay

1
奇迹般有效。有人可以解释为什么吗?
RadioLog '20

1
如果我已经有一个桥接头并且问题仍然存在怎么办?我上运行MacOS MojaveXCode 11.3.1
blastervla

86

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


10
这很好用!对于任何想知道如何做到这一点的人;在文件资源管理器中单击xcode项目->Targets选择目标->选择Build Settings选项卡->搜索Library Search Paths并添加$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)到调试和发布部分。
拉里·费舍曼(LarryFisherman),

6
不幸的是,当将Swift 5与Xcode 10.2一起使用时,此技巧似乎已停止工作-可能是因为现在存在系统范围的iOS 12.2的Swift库。
megastep

3
对于那些谁是新的Xcode确保“所有”被选择,是蓝色否则你可能找不到库搜索路径
阿马尔

1
尝试将以下内容添加到目标的库搜索路径中:$(TOOLCHAIN_DIR)/usr/lib/swift-5.0 / $(PLATFORM_NAME)
gom1

1
它可以编译,但是随后在应用程序启动时崩溃:“此libswiftCore.dylib副本需要12.2.0之前的OS版本”。如果您想解决它,只需在项目中添加一个空的swift文件,将其永久保存即可使用。(问题出在您的应用中同时使用了Objective-C和
Swift

77

就我而言,这是在添加Swift Pods库之后的一个React-Native项目。也许只是步骤2可以工作:

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

1) File -> New -> File <code>文件->新建->文件</ code>

2)选择 Swift File 选择<code>快速文件</ code>

3)确认 Create Bridging Header 在此处输入图片说明

  1. 转到Build Settings并设置Always Embed Swift Standard LibrariesYES 始终嵌入Swift标准库

我将文件放在Pod或项目下的哪里?
lutakyn

@lutakyn我已将其放入项目中
AlVelig

2
这对于我的本机生成=> RN 60.5,将cocoapods更新为1.8.4,然后这样做解决了我的生成问题(还清理了生成文件夹)。
IronWorkshop

1
为我工作,没有最后一步>转到“构建设置”,并将“始终嵌入Swift标准库”设置为“是”
Oleg Dater 19/12/4

1
@dcangulo仅当您的文件名包含“ bridging-header”时,此步骤才会显示
Luca Davanzo

21

对于XCode 11 beta 4,库搜索路径应为:

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

1
我必须将其添加到每个目标“库搜索路径”属性中。不仅是主应用程序。因此,包括我的手表套件和Siri Intents目标。
点击表格

使用Swift代码的所有目标都必须具有上述XCode 11的路径
gom1


12
  1. 右键单击项目名称并添加一个新的swift文件,将其保留为File.swift
  2. 它将要求您创建一个新的桥接头接受
  3. 再次运行项目

3

亚历克斯答案的更新:

就我而言,这是在添加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 LibrariesYES 始终嵌入Swift标准库

2

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


我故意更改了它...可以在arm64上编译它的任何方式(在模拟器上都能正常工作)吗?
基洛

2

XCode 11.3 Beta,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




0

@AlVelig的答案对我有用。

我的案例是Flutter Project,我添加了一个包(searchable_dropdown),该包由Swift编写。

输出警告为:

找不到自动链接的库'swiftObjectiveC'

找不到自动链接的库'swiftCore'

......



0

在尝试将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

(请确保在彩票回购中检查当前的停靠站以获取最新版本。)

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

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

这解决了我的问题。

祝你好运。


0

如果将xCode更新到版本12后出现问题和错误

找不到或使用自动链接的库'swiftWebKit'

还有两个。

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

希望它的帮助:)


1
@SehiiVolynets,请使用斜体(使用*方括号)表示路径。
maciejwww

0

对于Xcode 12.2

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


0

如果您的Xcode版本> = 12.2

BuildSettings->链接-> Runpath搜索路径

/usr/lib/swift像这样添加为您的第一个参数:

在此处输入图片说明


有人可以向我解释为什么-1吗?因为我已经尝试过了,现在我不再需要不断清理=>重建,只要我更改一行。注意:我还需要将“启用位码”设置为“否”
Cristiano Santos

0

我已经导出了我的统一项目。早先它只是通过按create create Bridging Header添加空的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那么就可以了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.