从Objective c项目调用单独项目中的swift文件。 Apple Mach-o Linker错误

时间:2017-05-04 21:23:36

标签: objective-c swift linker-errors objective-c-swift-bridge

我们有一个传统的iOS目标C应用程序。我们想添加" swift"功能。创建了一个单独的" Cocoa触摸框架"项目从"目标C"项目。当我尝试从目标c

调用/ init 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 /箱:在/ 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 /产品/调试-iphonesimulator -F /用户/ 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 /超aybvkjtipygrszeyqsnbmtglaaqi /编译/中间体/ super.build /调试-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 - 框架OCMockitoIOS -framework安全-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 / Inter mediates / 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

     

架构x86_64的未定义符号:     " _OBJC_CLASS _ $ __ TtC5utils3zip",引自:         libDashboard.a中的objc-class-ref(ASLandingPageVC.o)   ld:找不到架构x86_64的符号   clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

swift库的名称是" utils"。遗留目标c app使用其他一些项目依赖项。抱歉,新手到xcode。

1 个答案:

答案 0 :(得分:0)

在不确切知道你如何在Objective-C应用程序中引用Swift框架的情况下,我只能猜测你引用了一个框架二进制文件,该框架二进制文件是为不同于你试图构建应用程序的平台构建的。

例如,如果您在应用程序的构建设置下的框架搜索路径中构建了一个设备框架,然后将其包含在包含生成的.framework目录的目录的路径中,那么就会发生这种情况。为模拟器构建应用程序。如果您使用了正确的框架二进制文件(在这种情况下为模拟器构建),它将起作用。

但是,更优雅的方法是在应用程序中嵌入Swift框架。假设框架和应用程序位于不同的项目中,您可以执行以下操作:

  • 确保框架项目未在Xcode中打开。
  • 在Xcode中打开应用程序项目。
  • 将框架的.xcodeproj从Finder拖到Xcode中的应用程序项目中以创建引用。
  • 一般情况下 - >嵌入式二进制文件添加了你的Swift .framework。
  • 在构建应用程序时,Xcode将为正确的架构构建框架并使用并将其嵌入到您的应用程序中。

有关嵌入框架的详细信息,请参阅https://developer.apple.com/library/content/technotes/tn2435/_index.html。顺便说一句,当链接器失败时,您是否也看到ld发出的关于缺少必需体系结构的文件的警告?