1. 程式人生 > >qrencode 第三方庫 的vs編譯---------------------完全正確

qrencode 第三方庫 的vs編譯---------------------完全正確

http://blog.csdn.net/liyuanbhu/article/details/44647139

qrencode 是一個生成QR 二維碼的開源庫,用法很簡單,但是沒有提供在vs 系統下編譯的專案檔案,所以在win下使用不太方便。為此,我研究了一下,搞定了用 VC 2010 編譯生成靜態庫的方法。

建立一個 win32 專案,選擇生成靜態庫,不使用預編譯頭。

將 qrencode 的原始檔(.c 和 .h)全部拷到vc 的專案目錄中,除了 qrenc.c 。

編譯 qrencode 時還需要有個 config.h 檔案,這個檔案是 configure 時自動生成的,可以用我下面提供的這個。

  1. /* config.h.  Generated from config.h.in by configure.  */
  2. /* config.h.in.  Generated from configure.ac by autoheader.  */
  3. /* Define to 1 if you have the <inttypes.h> header file. */
  4. #define HAVE_INTTYPES_H 1
  5. /* Define to 1 if using pthread is enabled. */
  6. #undef HAVE_LIBPTHREAD
  7. /* Define to 1 if you have the <memory.h> header file. */
  8. #define HAVE_MEMORY_H 1
  9. /* Define to 1 if you have the <stdint.h> header file. */
  10. #define HAVE_STDINT_H 1
  11. /* Define to 1 if you have the <stdlib.h> header file. */
  12. #define HAVE_STDLIB_H 1
  13. /* Define to 1 if you have the <strings.h> header file. */
  14. #define HAVE_STRINGS_H 1
  15. /* Define to 1 if you have the <string.h> header file. */
  16. #define HAVE_STRING_H 1
  17. /* Define to 1 if you have the `strdup' function. */
  18. #define HAVE_STRDUP 1
  19. /* Define to 1 if you have the <sys/stat.h> header file. */
  20. #define HAVE_SYS_STAT_H 1
  21. /* Define to 1 if you have the <sys/types.h> header file. */
  22. #define HAVE_SYS_TYPES_H 1
  23. /* Define to 1 if you have the <unistd.h> header file. */
  24. #define HAVE_UNISTD_H 1
  25. /* Major version number */
  26. #define MAJOR_VERSION 3
  27. /* Micro version number */
  28. #define MICRO_VERSION 4
  29. /* Minor version number */
  30. #define MINOR_VERSION 4
  31. /* Name of package */
  32. #define PACKAGE "qrencode"
  33. /* Define to the address where bug reports for this package should be sent. */
  34. #define PACKAGE_BUGREPORT ""
  35. /* Define to the full name of this package. */
  36. #define PACKAGE_NAME "QRencode"
  37. /* Define to the full name and version of this package. */
  38. #define PACKAGE_STRING "QRencode 3.4.4"
  39. /* Define to the one symbol short name of this package. */
  40. #define PACKAGE_TARNAME "qrencode"
  41. /* Define to the home page for this package. */
  42. #define PACKAGE_URL ""
  43. /* Define to the version of this package. */
  44. #define PACKAGE_VERSION "3.4.4"
  45. /* Define to 1 if you have the ANSI C header files. */
  46. #define STDC_HEADERS 1
  47. /* Version number of package */
  48. #define VERSION "3.4.4"
  49. #define inline
  50. /* Define to 'static' if no test programs will be compiled. */
  51. #define __STATIC static
  52. /* #undef WITH_TESTS */

然後在專案屬性中新增預處理定義:HAVE_CONFIG_H

 

這裡有一點需要解釋一下,config.h 中有一行:

#define inline

之所以要這麼寫是因為rscode.c 檔案中有個modnn的定義如下:

  1. staticinlineint modnn(RS *rs, int x){  
  2.     while (x >= rs->nn) {  
  3.         x -= rs->nn;  
  4.         x = (x >> rs->mm) + (x & rs->nn);  
  5.     }  
  6.     return x;  
  7. }  

這個程式碼在vc2010中無法編譯通過,去掉 inline 就可以順利編譯通過了。

所以才要寫:

#define inline


然後編譯就可以生成 qrencode.lib 了。

這裡補充說明幾點:

qrencode 本身是不依賴於 libpng 庫的。所以不存在什麼缺少 png.h 的問題。按照本文介紹的方法按部就班的做就能生成靜態庫,不存在任何問題。

編譯時一定要排除 qrenc.c 這個檔案。這個檔案是 qrencode 的一個使用例子,與這個庫本身無關。

缺少 png.h 或者 缺少 getopt.h 都是在編譯 qrenc.c 時才會遇到的問題。與編譯 qrencode 無關。如果真的需要編譯 qrenc.c,那就先編譯 libpng , getopt.h  不是C 標準的標頭檔案,vs 裡是沒有的,但是網上也可以找到解決辦法,隨便百度一下就能找到。