OBJC_CLASS_$_MTSCRA"的引用,来自于...

3
我正在尝试通过链接下载运行示例代码。

http://www.magtek.com/support/software/downloads/sw/99510108.zip

这是一个读卡器API,这里有一份示例代码。当我运行此代码时,我遇到了错误:
ld: warning: ignoring file /Users/gaurav.garg/Downloads/99510108/SampleCode/Lib/libMTSCRA.a, missing required architecture i386 in file
Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_MTSCRA", referenced from:
      objc-class-ref in MagTekDemoAppDelegate.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

MTSCRA类仅为头文件,而我检查过的解决方案是我们必须将.m文件添加到目标的编译源路径的构建阶段中...但不幸的是,我没有MTSCRA.m文件。MTscra.h中包含AudioToolBox和externalAccesory框架。

3个回答

8
实际上问题在于MagTek提供了两个不同的.a文件。
如果您查看Release-iphoneos中的一个并运行以下命令:
> lipo -info libMTSCRA.a 
Architectures in the fat file: libMTSCRA.a are: armv7 (cputype (12) cpusubtype (11))

同样,如果您查看Release-iphonesimulator中的一个...
> lipo -info libMTSCRA.a 
input file libMTSCRA.a is not a fat file
Non-fat file: libMTSCRA.a is architecture: i386

因此,真正的答案是创建一个新的libMTSCRA.a文件,将两个文件合并成n路FAT,并使用lib工具创建单独的DEBUG和RELEASE库搜索路径。

首先,您需要进入MagTek存储两个不同版本的libMTSCRA.a文件的目录。当您到达那里时,运行以下命令:

libtool -static -o libMTSCRA_FAT.a Release-iphoneos/libMTSCRA.a Release-iphonesimulator/libMTSCRA.a 

当您检查输出文件时,您应该看到:
>lipo -info libMTSCRA_FAT.a 
Architectures in the fat file: libMTSCRA.a are: armv7 (cputype (12) cpusubtype (11)) i386 

在您的项目中,创建两个文件夹(也称为组)“debug”和“release”,然后重新构建DEBUG和RELEASE库搜索路径以使用这些相应的目录。
最后,将libMTSCRA_FAT.a重命名为libMTSCRA.a,并将其放置在调试搜索路径中,在发布中保留iOS(armv7(cputype(12)cpusubtype(11)))。我们这样做的原因是,虽然在调试模式下使用这个新创建的.a文件可能没问题,但将其推入生产中被认为是不好的品味,因为我们没有办法确认合并的lib是否完全符合我们的意图(archs的合并)。
完成了!

3
Undefined symbols for architecture i386:

这意味着,你链接的库没有i386架构的符号。这意味着你无法在模拟器上使用它。你需要在设备上运行示例,或者获取为模拟器创建的库的版本。

@bastahlhood:在设备上运行时,我遇到了以下错误: Error launching remote program: No such file or directory (/Users/gaurav.garg/Library/Developer/Xcode/DerivedData/MagTekDemo-eojqpfzujdtekwftlqbzzyfmuwng/Build/Products/Debug-iphoneos/MTDemo.SCRA.app/MTDemo.SCRA). 我正在使用开发者配置文件运行它。我已经多次清理过了。构建已安装但不会立即打开。我们需要手动打开应用程序。 - Gaurav Garg
@bastahlhood:找到了。 我们必须退出Xcode即重新启动应用程序。谢谢。 - Gaurav Garg
1
我最近遇到了完全相同的问题。我发现条件链接起作用了。Magtek演示包括iphoneos和iphone-simulator符号。https://dev59.com/0XM_5IYBdhLWcg3w02z8 - subv3rsion

0

你需要确保包含了该库所需的所有框架。


我不知道需要哪些框架.....但是已经添加了Audiotoolbox、ExternalAccessory框架和3个基本框架。还有一件事,Mtscra.h文件已经导入了Foundation、AudioToolbox、AudioUnit、ExternalAccessory,但是当我添加Audiounit框架时,它显示另一个错误,即找不到Audiounit框架。 - Gaurav Garg
那几乎可以肯定是你的问题。 - Matt Hudson
同时添加CoreAudio.framework和AudioToolbox.framework以支持AudioUnit。 - Matt Hudson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接