源碼
下載最新Zbar源碼(http://zbar.sourceforge.net/),網站的WIKI是空白的,所以只能在源碼包里找使用說明了,很遺憾Windows下怎么編譯沒說明,只是說明了Windows安裝包的使用(可能看得不夠仔細,沒找到),源碼包里面有個VS的工程同樣是用庫文件的。網上搜了一下,也都是使用官網Windows安裝包,然后調用安裝目錄的庫文件的例程,直接使用源碼的找不到。倒是剛好找到了一個STM32F4的版本(http://www.openedv.com/forum.php?mod=viewthread&tid=82582&page=1),按照其說明貌似是有問題,不能使用的,但能編譯,至少還有些參考價值,比如需要使用到源碼包里面的那些文件。源碼目錄如下,需要使用的文件,基本在zbar文件夾內。
移植過程
開始時使用的IDE是VS,由於平時會寫一些上位機和小工具,所以第一時間想到的是VS。但經過一番折騰還是投降了。因為Zbar是用C99寫的,還有用了不少GCC的語法,使用VC編譯不了。於是下載了CodeBlock,下載是codeblocks-17.12mingw-setup.exe,帶mingw,包含GCC和GDB,鏈接http://www.codeblocks.org/downloads/26。
以下是移植記錄:
1: 新建Console工程
2: 復制zbar-0.10\include\zbar.h到zbar-0.10\zbar\,並且把zbar文件夾復制到工程目錄
3:添加zbar-0.10\zbar\decoder和zbar-0.10\zbar\qrcode目錄下的源碼
4:添加zbar-0.10\zbar\目錄下的config.c,decoder.c,error.c,image.c, img_scanner.c, refcnt.c. scanner.c,symbol.c
工程結構如下:
5:添加相關頭文件路徑,編譯
報錯
Zbar\zbar\config.c|24|fatal error: config.h: No such file or directory|
搜遍整個源碼目錄也沒看到有config.h。查看了源碼包根目錄下INSTALL文件,config.h應該是由autoconf工具生成的,但這東西又是linux或unix下的,於是拷貝ZBar到Linux下,按照INSTALL的說明生成config.h,再添加回windows下的工程目錄,
1 /* include/config.h. Generated from config.h.in by configure. */ 2 /* include/config.h.in. Generated from configure.ac by autoheader. */ 3 4 /* whether to build support for Code 128 symbology */ 5 #define ENABLE_CODE128 1 6 7 /* whether to build support for Code 39 symbology */ 8 #define ENABLE_CODE39 1 9 10 /* whether to build support for EAN symbologies */ 11 #define ENABLE_EAN 1 12 13 /* whether to build support for Interleaved 2 of 5 symbology */ 14 #define ENABLE_I25 1 15 16 /* whether to build support for PDF417 symbology */ 17 #define ENABLE_PDF417 18 19 /* whether to build support for QR Code */ 20 #define ENABLE_QRCODE 1 21 22 /* Program major version (before the '.') as a number */ 23 #define ZBAR_VERSION_MAJOR 0 24 25 /* Program minor version (after '.') as a number */ 26 #define ZBAR_VERSION_MINOR 10
編譯。
報錯
Zbar\zbar\qrcode\qrdectxt.c|9|fatal error: iconv.h: No such file or directory|
Iconv同樣是linux下的東西,Windows編譯Linux下的源碼就是苦逼。
下載並安裝libiconv-1.9.2-1.exe(http://gnuwin32.sourceforge.net/packages.html)
將安裝目錄下的iconv.h,libcharset.h,localcharset.h,libiconv2.dll拷貝工程目錄下,並設置相關頭文件和lib路徑
重新編譯后
報錯Zbar\zbar\image.c|217|error: expected ')' before 'PRIx32'|
PRIx32是在inttypes.h定義的,包含該頭文件后再編譯,終於不報錯了。
6:編譯通過后,那怎么使用呢?查看zbar-0.10\examples目錄下文件,里面是一些使用例程,最終挑選了zbar-0.10\examples\scan_image.c,將其內容復制粘貼到main.c,重新編譯
報錯
Zbar\main.c|3|fatal error: png.h: No such file or directory|
下載並安裝libpng-1.2.37-setup.exe(http://gnuwin32.sourceforge.net/packages.html)
將安裝目錄下的png.h,pngconf.h,libpng12.dll拷貝工程目錄下,並設置相關頭文件和lib路徑
重新編譯
報錯
png\include\png.h|477|fatal error: zlib.h: No such file or directory|
下載並安裝zlib-1.2.3.exe(http://gnuwin32.sourceforge.net/packages.html)
將安裝目錄下的zconf.h,zlib.h,zlib1.dll拷貝工程目錄下,並設置相關頭文件和lib路徑
重新編譯。
通過。
7:將zbar-0.10\examples\barcode.png復制到工程根目錄,對main.c做一下修改
屏蔽if(argc < 2) return(1);
get_data(argv[1], &width, &height, &raw);改為get_data("barcode.png", &width, &height, &raw);
重新編譯運行后,窗口輸出如下:
到此,ZBar基本能正常運行了。
最終的工程結構如下: