当前位置:首页 » 操作系统 » zbar源码

zbar源码

发布时间: 2025-03-17 23:42:18

Ⅰ 请教库冲突的导致的 plicate symbol 链接错误

场景:
解决TencentOpenAPI.framework与ZbarSDK中 _base64_encode 函数的冲突
后来在网络上搜寻,删除掉 Other Linker Flag 的 -all_load 就可以解决静态库冲突的问题,
但是这样做的话,会使一些外部的静态库,使用objc扩展函数(catagory)的方法失效。例如BaiMapApi
如果是有些库使用到了扩展函数(catagory)可以分别对这个库进行加载
使用:-force_load
-force_load BaiMapApi/libs/Release-iphoneos/libmapapi.a

(BaiMapApi是添加到当前目录下的)

-force_load $(BUILT_PRODUCTS_DIR)/libxxx.a

(这里是直接添加静态库项目源码的做法)
使用-force_load分别进行加载还是蛮方便的,如果有些函数加入了main函数使用all_load就相当麻烦了。
以上可以解决TencentOpenAPI.framework与ZbarSDK的冲突
如果两个静态库冲突的结构是相同的,可以考虑将两个静态库拆分出来进行合并。
查看文件的架构有哪些

$ lipo -info libzbar.a
Architectures in the fat file: libzbar.a are: armv7 (cputype (12) cpusubtype (11)) i386
将armv7解压出来
lipo libzbar.a -thin armv7 -output libzbar-armv7.a

新建立一个文件夹出来存放解压的(.o)文件

$ mkdir armv7
$ cd armv7
将静态库中的文件解压
$ ar -x ../libzbar-armv7.a
然后将另一个静态库根据以上的步骤做一遍,然后观察连个解压的静态库中,有那些是一样的就合并在一起,不过注意的是两个静态库冲突的(.o)文件必须一致,否则也会出现错误。
合并完后进行打包了
$ libtool -static -o ../libnew-armv7.a *.o
如果像在虚拟机也使用,进行相同的步骤后,将i386的架构合并再一起就可以了。
合并静态库
$ lipo -create -output lib.a libnew-armv76.a libi386.a
plicate symbol是一种常见的链接错误,不像编译错误那样可以直接定位到问题的所在。但是经过一段时间的总结,发现这种错误总是有一些规律可以找的。

例如,我们有如下的最简单的两个类代码:
// ClassA.h
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
@end
// ClassA.m
#import "ClassA.h"
@implementation ClassA
@end
// ClassB.h
#import <Foundation/Foundation.h>
@interface ClassB : NSObject
@end
// ClassB.m
#import "ClassB.h”
@implementation ClassB
@end
编译后出现的错误信息如下:
plicate symbol _OBJC_METACLASS_$_ClassA in:

/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassA.o

/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassB.o
plicate
symbol _OBJC_CLASS_$_ClassA in:
/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassA.o

/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassB.old:
2
plicate symbols for architecture i386clang:
error: linker command failed with exit code 1 (use -v to see invocation)
从上面出现问题的地方,我们应该能推测出是ClassA这个类出了问题。如果这个类是我们自己写的,就容易办一些。
可以考虑以下原因:
1.引入头文件时,由于疏忽,误引入.m文件。这种一般仔细检查一下出现问题的类的源文件就能发现。
例:ClassB.m 文件修改成下面这样
#import "ClassB.h>"
#import "ClassA.m” // 这句话有问题
@implementation ClassB
@end
2.同一个类,实现两次,即有两个@implementation 。这种一般会有一个警告,也比较容易发现。
例:ClassB.m文件修改成下面这样:
// ClassB.m
#import "ClassB.h”
@implementation ClassB
@end
@implementation ClassA
@end
3.工程文件,同一个类文件被引入了两次,引起这种错误的原因大概有两种:一是多人协作开发时,导致project文件合并冲突;二是同名文件不在同一目录下,添加到工程时造成重复添加。 这种一般在文件视图,用名字过滤器检查一下就发现了。
4.
Targets的Build Phase设置项里,查看Complie
Sources这一项,看看出现问题的类是不是有重复的,用文件名过滤也比较容易发现。这种问题一般也是多人协作开发时,project文件冲突导致的。
发现这种问题,只要删除就可以了。不过在我解决问题过程中,删除其中一个文件时,重复文件会自动全部删除,所以还需要单独添加一下。
5.如果我们的工程中引用了第三方的库,而恰好第三方的库里面有一个ClassA,也会出现这种问题。如果不能修改第三方的库代码,只能修改我信自己的代码了。

Ⅱ 用OpenCV和Python识别二维码和条形码

在计算机视觉领域,Adrian Rosebrock最近分享了一种方法,借助OpenCV和Zbar库,实现实时识别二维码和条形码的扫描程序,并最终部署在树莓派上,制作出实用的条形码与二维码扫描设备。他指出,OpenCV无法直接识别条形码和二维码,但可以优化读取过程,包括从硬盘加载图像、从视频流中抓取帧,并对其进行处理。一旦获取图像或视频帧,就可以将其传递给Python中的条形码解码库Zbar,Zbar负责解码条形码或二维码。OpenCV则继续进行图像处理并展示结果。整个过程看似复杂,实则简单明了。

为了实现这一目标,Adrian提供了详细的步骤。首先,安装Zbar及其Python绑定,以用于解码条形码和二维码。他建议按照Staya Mallick在LearnOpenCV博客上的教程操作,但做了调整以确保兼容Python3、准确检测和定位图像中的二维码及条形码,并简化安装过程。通过三步操作,即可完成安装:从apt或brew库中安装Zbar、创建虚拟环境并安装OpenCV、安装Pyzbar。

在安装完成后,Adrian指导读者创建一个名为barcode_scanner_image.py的文件,用于实现单张图像扫描。通过导入所需的库、解析命令行参数、加载图像、调用pyzbar.decode检测和解码图像中的条形码,并在图像上绘制边界框和显示信息,读者可以轻松实现这一功能。Adrian还演示了如何测试代码,显示正确的发现和解码结果。

接着,Adrian介绍了如何使用OpenCV实时读取条形码和二维码。他创建了一个名为barcode_scanner_video.py的文件,用于实现实时检测和解码。通过解析命令行参数、初始化视频流、调整帧大小、调用pyzbar.decode检测帧中的条形码,并在检测到条形码时将时间戳和数据写入CSV文件,读者可以实现实时扫描条形码和二维码。Adrian还展示了如何将实现部署到树莓派上,成功识别各种条形码和二维码。

Adrian在文中详细介绍了从安装Zbar、创建虚拟环境、安装OpenCV到实现单张图像和实时视频扫描的完整过程。他强调使用虚拟环境的重要性,并提供了实现代码示例,让读者能够轻松复制并运行这些步骤。最后,他鼓励读者自己尝试创建这样的条形码和二维码扫描仪,并提供了项目源代码的下载链接。

Ⅲ QR码有c/c++的应用程序编程接口(api)吗

API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
上面的是官方解释
这样说吧,我要实现很复杂的处理比如进行某个数据库操作A,现在用C语言写了一大堆函数,用来进行操作A。
封装到一个库。
其中,最上层函数是这样的
void function(void) {
func1();
func2();
func3();
。。。。。
}
现在我要写一段代码了,同样要进行数据库操作A,我不需要知道具体该进行多少行代码的操作。
我只知道用function就可以达到我的目的就可以了,至于function到底怎么执行我不关心。
所以,我引入了这个库,然后调用了这个函数function,这个function就是一个API

热点内容
联想电脑怎么查配置 发布:2025-03-18 07:49:38 浏览:360
云虚机和云服务器 发布:2025-03-18 07:49:00 浏览:683
点击php函数 发布:2025-03-18 07:45:12 浏览:617
算法应该包含 发布:2025-03-18 07:40:25 浏览:512
oss有加密 发布:2025-03-18 07:36:00 浏览:341
如何获取ftp服务器的ip地址 发布:2025-03-18 07:35:53 浏览:538
log4jmybatissql 发布:2025-03-18 07:33:33 浏览:450
苹果6sp相册怎么加密 发布:2025-03-18 07:27:50 浏览:211
ark怎么开联机服务器 发布:2025-03-18 07:27:10 浏览:130
居家矛盾脚本 发布:2025-03-18 07:24:48 浏览:832