qrencode 第三方庫 的vs編譯---------------------完全正確
阿新 • • 發佈:2019-01-30
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 時自動生成的,可以用我下面提供的這個。
- /* config.h. Generated from config.h.in by configure. */
- /* config.h.in. Generated from configure.ac by autoheader. */
- /* Define to 1 if you have the <inttypes.h> header file. */
- #define HAVE_INTTYPES_H 1
- /* Define to 1 if using pthread is enabled. */
- #undef HAVE_LIBPTHREAD
- /* Define to 1 if you have the <memory.h> header file. */
- #define HAVE_MEMORY_H 1
- /* Define to 1 if you have the <stdint.h> header file. */
- #define HAVE_STDINT_H 1
- /* Define to 1 if you have the <stdlib.h> header file. */
- #define HAVE_STDLIB_H 1
- /* Define to 1 if you have the <strings.h> header file. */
- #define HAVE_STRINGS_H 1
- /* Define to 1 if you have the <string.h> header file. */
- #define HAVE_STRING_H 1
- /* Define to 1 if you have the `strdup' function. */
- #define HAVE_STRDUP 1
- /* Define to 1 if you have the <sys/stat.h> header file. */
- #define HAVE_SYS_STAT_H 1
- /* Define to 1 if you have the <sys/types.h> header file. */
- #define HAVE_SYS_TYPES_H 1
- /* Define to 1 if you have the <unistd.h> header file. */
- #define HAVE_UNISTD_H 1
- /* Major version number */
- #define MAJOR_VERSION 3
- /* Micro version number */
- #define MICRO_VERSION 4
- /* Minor version number */
- #define MINOR_VERSION 4
- /* Name of package */
- #define PACKAGE "qrencode"
- /* Define to the address where bug reports for this package should be sent. */
- #define PACKAGE_BUGREPORT ""
- /* Define to the full name of this package. */
- #define PACKAGE_NAME "QRencode"
- /* Define to the full name and version of this package. */
- #define PACKAGE_STRING "QRencode 3.4.4"
- /* Define to the one symbol short name of this package. */
- #define PACKAGE_TARNAME "qrencode"
- /* Define to the home page for this package. */
- #define PACKAGE_URL ""
- /* Define to the version of this package. */
- #define PACKAGE_VERSION "3.4.4"
- /* Define to 1 if you have the ANSI C header files. */
- #define STDC_HEADERS 1
- /* Version number of package */
- #define VERSION "3.4.4"
- #define inline
- /* Define to 'static' if no test programs will be compiled. */
- #define __STATIC static
- /* #undef WITH_TESTS */
然後在專案屬性中新增預處理定義:HAVE_CONFIG_H
這裡有一點需要解釋一下,config.h 中有一行:
#define inline
之所以要這麼寫是因為rscode.c 檔案中有個modnn的定義如下:
- staticinlineint modnn(RS *rs, int x){
- while (x >= rs->nn) {
- x -= rs->nn;
- x = (x >> rs->mm) + (x & rs->nn);
- }
- return x;
- }
這個程式碼在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 裡是沒有的,但是網上也可以找到解決辦法,隨便百度一下就能找到。