當前位置:首頁 » 操作系統 » 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

熱點內容
java遍歷二維數組 發布:2025-03-18 03:36:01 瀏覽:410
銳捷源碼 發布:2025-03-18 03:26:55 瀏覽:436
訴訟中止裁定後可否解壓 發布:2025-03-18 03:24:51 瀏覽:128
sqlserver全文搜索 發布:2025-03-18 03:23:58 瀏覽:715
u盤裡面文件夾沒有了 發布:2025-03-18 03:22:19 瀏覽:229
華為p系列手機哪個配置好 發布:2025-03-18 03:20:13 瀏覽:621
易語言連接access資料庫 發布:2025-03-18 03:12:48 瀏覽:661
苗木源碼 發布:2025-03-18 03:12:38 瀏覽:747
oracle卸載資料庫 發布:2025-03-18 03:05:15 瀏覽:46
編譯時生成固件怎麼辦 發布:2025-03-18 03:04:30 瀏覽:707