今天要用到二维码扫描的功能,将之前做的一个可以正确运行的demo的zxing移植到新工程,却出现了iostream file notfound的问题。以下为解决办法。
参考以下文章可以完成将zxing加入到xcode中。
其实主要有几个步骤:
1、下载zxing2.1代码库后http://code.google.com/p/zxing/downloads/list,解压。将iphone目录和cpp复制到工程的目录里。要与工程的.xcodeproj文件同一级。
2、打开自己的工程,将iphone/ZXingWidget目录下的ZXingWidget.xcode文件拖拽添加到项目中
3、设置自己项目的Link Binary With Libraries
TARGETS ->Build Phases -> Link Binary With Libraries
点击+,添加libZXingWidget.a
4、设置自己项目的Target Dependencies
TARGETS ->Build Phases -> Target Dependencies
点击+,添加ZXingWidget
5、设置Header Search Paths
TARGET ->Build Settings -> Search Paths -> Header Search Paths
添加“./iphone/ZXingWidget/Classes”相对路径,选择recursive
添加“./cpp/core/src”相对路径,选择non-recursive
6、导入iOS框架
TARGETS ->Build Phases -> Link Binary With Libraries
点击+,添加AVFoundation、AudioToolbox、CoreVideo、CoreMedia、libiconv、AddressBook和AddressBookUI
7、修改使用的那个.m文件的后缀为.mm
在这个.mm文件前面加入类引用
#import <ZXingWidgetController.h>
#import <QRCodeReader.h>
在接口申明后面加入委托:
@interface HomeViewController ()<ZXingDelegate>
- (void)loadFunModelPanels;
@end
使用方法一
ZXing直接提供了一个扫描二维码的ViewController,即ZXingWidgetController。在
需要扫描的时候,调用如下代码即可:
- (IBAction)scanCode:(id)sender{s
ZXingWidgetController *widController = [[ZXingWidgetControlleralloc] initWithDelegate:selfshowCancel:YESOneDMode:NO];
NSMutableSet *readers = [[NSMutableSetalloc ] init];
QRCodeReader* qrcodeReader = [[QRCodeReader alloc] init];
[readers addObject:qrcodeReader];
widController.readers = readers;
[selfpresentModalViewController:widController animated:YES];
}
在ZXing扫描有结果时,会调用如下回调函数:
1 @protocolZXingDelegate
2 - (void)zxingController:(ZXingWidgetController*)controllerdidScanResult:(NSString *)result;
3 - (void)zxingControllerDidCancel:(ZXingWidgetController*)controller;
4 @end
以下可能遇到的一些编译问题:
1.如果你项目中使用了zxing,但是在xcdoe升级到4.5以后出现Incompatible pointer types sending'Class' (aka 'Class *') to parameter of type 'id<NSCopying>'错误,解决办法:重新下载更新版本的ZXing,可以使用命令下载最新版本:svncheckout http://zxing.googlecode.com/svn/trunk/ zxing-read-only。
2.如果出现了问题Undefined symbols for architecturei386"std::string::c_str() const", referenced from。。。。,
将你项目中的Apple LLVM compiler 4.1 - language中的 c Language Dialect、c++ Language Dialect、c++ standard Library设置成下图所选的值。参考http://stackoverflow.com/questions/12665457/zxing-in-xcode-4-5-and-ios-6
3.编译成功往真机上装的时候出现Choose a destination with a supportedarchitecture in order to run on this device ,由于ios设备不支持armv7s,所以必须将Architectures设置为armv6,但是仅仅需要改动valid architectures就行,不要改动architectures,否则容易引起真机不运行。把architectures改为$(ARCHS_STANDARD_32_BIT)就可以撞到手机上了。见http://blog.sina.com.cn/s/blog_90a0ad8d01013uuh.html
4:XCode 手贱升级到了 4.6 ZXingSDK 编译不过去了.
出现什么变量声明了没有使用的编译错误提示(可是明明使用了):
Member initializer 'bits_' does not name anon-static data member or base class
谷歌老外牛人多啊,或者说老外也遇到这个问题了,然后提问了,问答地址如下:
http://code.google.com/p/zxing/issues/detail?id=1494
里面说到将 ZXingWidget - BuildSettings - Other WarningFlags 里的 -Werror 和 -Wno-unused-parameter 去掉,
但其实只要去掉 -Werror 就可以了, 如果 -Wno-unused-parameter 这个也去掉了会产生很多变量没有使用的警告.
此时可以编译通过了,烦恼的是 也有少许警告.
5.如果错误如下图所示,则将armv7s删除: