在 objective c 项目的单独项目中调用 swift 文件。 Apple Mach-o 链接器错误
calling swift file in seperate project from objective c project. Apple Mach-o Linker error
我们有一个遗留的 iOS objective C 应用程序。我们想添加 "swift" 功能。创建了一个单独的 "Cocoa touch framework" 项目以从 "objective C" 项目中引用它。当我尝试 call/init 来自 objective c
swift 中的任何方法时出现此错误
Ld /Users/teeboy/Library/Developer/Xcode/DerivedData/super-aybvkjtipygrszeyqsnbmtglaaqi/Build/Products/Debug-iphonesimulator/super.app/super normal x86_64
cd /Users/teeboy/iWorkbench/super
export IPHONEOS_DEPLOYMENT_TARGET=10.0
export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator10.3.sdk -L/Users/teeboy/Library/Developer/Xcode/DerivedData/super-aybvkjtipygrszeyqsnbmtglaaqi/Build/Products/Debug-iphonesimulator -F/Users/teeboy/Library/Developer/Xcode/DerivedData/super-aybvkjtipygrszeyqsnbmtglaaqi/Build/Products/Debug-iphonesimulator -F/Users/teeboy/iWorkbench/super -filelist /Users/teeboy/Library/Developer/Xcode/DerivedData/super-aybvkjtipygrszeyqsnbmtglaaqi/Build/Intermediates/super.build/Debug-iphonesimulator/super.build/Objects-normal/x86_64/super.LinkFileList -Xlinker -rpath -Xlinker @executable_path/Frameworks -mios-simulator-version-min=10.0 -dead_strip -Xlinker -object_path_lto -Xlinker /Users/teeboy/Library/Developer/Xcode/DerivedData/super-aybvkjtipygrszeyqsnbmtglaaqi/Build/Intermediates/super.build/Debug-iphonesimulator/super.build/Objects-normal/x86_64/super_lto.o -Xlinker -no_deduplicate -Xlinker -objc_abi_version -Xlinker 2 -fobjc-arc -fobjc-link-runtime -ObjC -all_load -Xlinker -sectcreate -Xlinker __TEXT -Xlinker __entitlements -Xlinker /Users/teeboy/Library/Developer/Xcode/DerivedData/super-aybvkjtipygrszeyqsnbmtglaaqi/Build/Intermediates/super.build/Debug-iphonesimulator/super.build/super.app.xcent -lz -lPatientSearch -framework MapKit -framework ZipArchive -framework QuartzCore -lMobuleMenuCell -framework OCMockitoIOS -framework Security -lModuleNavigation -lToDoList -framework CoreData -lPatientChart -framework CoreText -framework Crashlytics -framework CoreLocation -lVisitNotes -lDataAccess -lDashboard -framework MobileCoreServices -framework SystemConfiguration -lframework -lsuperCommon -framework UIKit -framework OCHamcrestIOS -framework Foundation -framework CoreGraphics -Xlinker -dependency_info -Xlinker /Users/teeboy/Library/Developer/Xcode/DerivedData/super-aybvkjtipygrszeyqsnbmtglaaqi/Build/Intermediates/super.build/Debug-iphonesimulator/super.build/Objects-normal/x86_64/super_dependency_info.dat -o /Users/teeboy/Library/Developer/Xcode/DerivedData/super-aybvkjtipygrszeyqsnbmtglaaqi/Build/Products/Debug-iphonesimulator/super.app/super
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$__TtC5utils3zip", referenced from:
objc-class-ref in libDashboard.a(ASLandingPageVC.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
swift 库的名称是 "utils"。遗留 objective c 应用程序使用了一些其他项目依赖项。抱歉,xcode.
的新手
不知道你是如何在 Objective-C 应用程序中引用 Swift 框架的,我只能猜测你引用了一个框架二进制文件,该二进制文件是为与你正在尝试的平台不同的平台构建的为
构建应用程序
例如,如果您为设备构建框架,然后在应用的构建设置下的框架搜索路径中包含包含生成的 .framework 目录的目录路径,然后尝试构建,就会发生这种情况模拟器的应用程序。如果您使用正确的框架二进制文件(在本例中是为模拟器构建的),它将起作用。
然而,更优雅的方法是在您的应用程序中嵌入 Swift 框架。假设框架和应用程序在不同的项目中,您可以执行以下操作:
- 确保框架项目未在Xcode中打开。
- 打开Xcode中的应用项目。
- 将框架的 .xcodeproj 从 Finder 拖到 Xcode 中的应用程序项目以创建引用。
- 在常规 -> 嵌入式二进制文件下添加您的 Swift .framework.
- 当您构建应用程序时,Xcode 将为正确的架构构建框架并使用它并将其嵌入到您的应用程序中。
有关嵌入框架的详细信息,请参阅 https://developer.apple.com/library/content/technotes/tn2435/_index.html。顺便说一句,当链接器失败时,您是否还看到来自 ld
的关于文件缺少所需架构的警告?
我们有一个遗留的 iOS objective C 应用程序。我们想添加 "swift" 功能。创建了一个单独的 "Cocoa touch framework" 项目以从 "objective C" 项目中引用它。当我尝试 call/init 来自 objective c
swift 中的任何方法时出现此错误Ld /Users/teeboy/Library/Developer/Xcode/DerivedData/super-aybvkjtipygrszeyqsnbmtglaaqi/Build/Products/Debug-iphonesimulator/super.app/super normal x86_64 cd /Users/teeboy/iWorkbench/super export IPHONEOS_DEPLOYMENT_TARGET=10.0 export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator10.3.sdk -L/Users/teeboy/Library/Developer/Xcode/DerivedData/super-aybvkjtipygrszeyqsnbmtglaaqi/Build/Products/Debug-iphonesimulator -F/Users/teeboy/Library/Developer/Xcode/DerivedData/super-aybvkjtipygrszeyqsnbmtglaaqi/Build/Products/Debug-iphonesimulator -F/Users/teeboy/iWorkbench/super -filelist /Users/teeboy/Library/Developer/Xcode/DerivedData/super-aybvkjtipygrszeyqsnbmtglaaqi/Build/Intermediates/super.build/Debug-iphonesimulator/super.build/Objects-normal/x86_64/super.LinkFileList -Xlinker -rpath -Xlinker @executable_path/Frameworks -mios-simulator-version-min=10.0 -dead_strip -Xlinker -object_path_lto -Xlinker /Users/teeboy/Library/Developer/Xcode/DerivedData/super-aybvkjtipygrszeyqsnbmtglaaqi/Build/Intermediates/super.build/Debug-iphonesimulator/super.build/Objects-normal/x86_64/super_lto.o -Xlinker -no_deduplicate -Xlinker -objc_abi_version -Xlinker 2 -fobjc-arc -fobjc-link-runtime -ObjC -all_load -Xlinker -sectcreate -Xlinker __TEXT -Xlinker __entitlements -Xlinker /Users/teeboy/Library/Developer/Xcode/DerivedData/super-aybvkjtipygrszeyqsnbmtglaaqi/Build/Intermediates/super.build/Debug-iphonesimulator/super.build/super.app.xcent -lz -lPatientSearch -framework MapKit -framework ZipArchive -framework QuartzCore -lMobuleMenuCell -framework OCMockitoIOS -framework Security -lModuleNavigation -lToDoList -framework CoreData -lPatientChart -framework CoreText -framework Crashlytics -framework CoreLocation -lVisitNotes -lDataAccess -lDashboard -framework MobileCoreServices -framework SystemConfiguration -lframework -lsuperCommon -framework UIKit -framework OCHamcrestIOS -framework Foundation -framework CoreGraphics -Xlinker -dependency_info -Xlinker /Users/teeboy/Library/Developer/Xcode/DerivedData/super-aybvkjtipygrszeyqsnbmtglaaqi/Build/Intermediates/super.build/Debug-iphonesimulator/super.build/Objects-normal/x86_64/super_dependency_info.dat -o /Users/teeboy/Library/Developer/Xcode/DerivedData/super-aybvkjtipygrszeyqsnbmtglaaqi/Build/Products/Debug-iphonesimulator/super.app/super
Undefined symbols for architecture x86_64: "_OBJC_CLASS_$__TtC5utils3zip", referenced from: objc-class-ref in libDashboard.a(ASLandingPageVC.o) ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
swift 库的名称是 "utils"。遗留 objective c 应用程序使用了一些其他项目依赖项。抱歉,xcode.
的新手不知道你是如何在 Objective-C 应用程序中引用 Swift 框架的,我只能猜测你引用了一个框架二进制文件,该二进制文件是为与你正在尝试的平台不同的平台构建的为
构建应用程序例如,如果您为设备构建框架,然后在应用的构建设置下的框架搜索路径中包含包含生成的 .framework 目录的目录路径,然后尝试构建,就会发生这种情况模拟器的应用程序。如果您使用正确的框架二进制文件(在本例中是为模拟器构建的),它将起作用。
然而,更优雅的方法是在您的应用程序中嵌入 Swift 框架。假设框架和应用程序在不同的项目中,您可以执行以下操作:
- 确保框架项目未在Xcode中打开。
- 打开Xcode中的应用项目。
- 将框架的 .xcodeproj 从 Finder 拖到 Xcode 中的应用程序项目以创建引用。
- 在常规 -> 嵌入式二进制文件下添加您的 Swift .framework.
- 当您构建应用程序时,Xcode 将为正确的架构构建框架并使用它并将其嵌入到您的应用程序中。
有关嵌入框架的详细信息,请参阅 https://developer.apple.com/library/content/technotes/tn2435/_index.html。顺便说一句,当链接器失败时,您是否还看到来自 ld
的关于文件缺少所需架构的警告?