SWIG 在 Windows 平臺上的編譯
【背景】參考 SWIG官網 上的步驟折騰我三天都沒搞定,MinGW 和 MSYS 一堆的問題,版本高了、低了都不行,生成的configure都有問題,擦了。。。好在柳暗花明又一村,今天搞定了用VS2015編譯SWIG,比官網上的那些步驟簡單超多,哇哈哈哈~~~
1 配置PCRE 靜態庫工程
這個PCRE 是SWIG 依賴的正則表示式開源庫。用原始碼編譯,步驟雖然看起來有點多,但實際上也並不麻煩。這裡寫一下編譯靜態庫的步驟:
(1)解壓原始碼包(比如這裡用的是 pcre-8.10.tar.bz2)
(2)把 config.h.generic 重新命名成 config.h
(3)把 pcre_chartables.c.dist 重新命名為 pcre_chartables.c
(4)工程中使用pcre_internal.h 和 ucp.h (實際上我把所有 *.h 都引入到工程也沒事)
(5)新增以下原始檔(這些檔案支援char型別字串已經足夠了;如果需要支援wchar 16位元組或者32位元組字串則還需要另增檔案,這裡先不寫了):
1 pcre_byte_order.c 2 pcre_chartables.c 3 pcre_compile.c 4 pcre_config.c 5 pcre_dfa_exec.cView Code6 pcre_exec.c 7 pcre_fullinfo.c 8 pcre_get.c 9 pcre_globals.c 10 pcre_jit_compile.c 11 pcre_maketables.c 12 pcre_newline.c 13 pcre_ord2utf8.c 14 pcre_refcount.c 15 pcre_string_utils.c 16 pcre_study.c 17 pcre_tables.c 18 pcre_ucd.c 19 pcre_valid_utf8.c 20 pcre_version.c 21 pcre_xclass.c22 pcre_try_flipped.c
(6)在靜態庫工程中宣告三個巨集定義:DLL_EXPORT、PCRE_STATIC、HAVE_CONFIG_H
2 配置 SWIG 可執行程式工程
SWIG 編譯更簡單一些,把所有標頭檔案和原始檔都載入進來即可:
(1)配置標頭檔案目錄,載入所有:Include、CParse、DOH、Modules、Preprocessor、Swig
(2)配置原始檔目錄,載入所有:CParse、DOH、Modules、Preprocessor、Swig
(3)在可執行工程中新增兩個巨集定義:HAVE_CONFIG_H、PCRE_STATIC
3 abtor工程配置
這裡直接給一下abtor工程配置,以供後續參考:
1 # 2 # vars 3 # 4 # ABTOR_TARGET : windows, mac, linux, android, ios 5 # ABTOR_HOST : windows, mac, linux 6 # ABTOR_CONFIG : debug, release 7 # ABTOR_VERSION 8 # 9 # 10 11 12 # 13 # functions 14 # 15 # abtor_path 16 # abtor_path_list 17 # abtor_glob 18 # abtor_remove 19 # abtor_exported_path 20 # abtor_include_dir 21 # 22 23 abtor_settings( 24 abtor_minimum_required='1.1.1', 25 ) 26 target_platform = []; 27 if ABTOR_TARGET == 'mac': 28 target_platform = ['/usr/local/include'] 29 30 abtor_global_ccxx( 31 defines=['HAVE_CONFIG_H', 'PCRE_STATIC'], 32 cxx_flags="", 33 c_flags="", 34 include_dirs=target_platform, 35 ) 36 37 ################################################## 38 ## CCache 39 wrapper_ccache_incs_dir = [] 40 wrapper_ccache_incs_dir.append(abtor_path('CCache')) 41 42 wrapper_ccache_incs = [] 43 wrapper_ccache_incs += abtor_glob(abtor_path('CCache/'), '*.h') 44 45 wrapper_ccache_srcs = [] 46 wrapper_ccache_srcs += abtor_glob(abtor_path('CCache/'), '*.c') 47 48 ################################################## 49 ## pcre 50 pcre_incs_dir = ['pcre_8.10'] 51 52 pcre_incs = [] 53 pcre_incs += abtor_glob(abtor_path('pcre_8.10/'), '*.h') 54 55 pcre_srcs = [] 56 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_byte_order.c') 57 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_chartables.c') 58 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_compile.c') 59 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_config.c') 60 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_dfa_exec.c') 61 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_exec.c') 62 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_fullinfo.c') 63 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_get.c') 64 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_globals.c') 65 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_jit_compile.c') 66 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_maketables.c') 67 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_newline.c') 68 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_ord2utf16.c') 69 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_refcount.c') 70 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_string_utils.c') 71 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_study.c') 72 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_tables.c') 73 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_ucd.c') 74 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_valid_utf8.c') 75 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_version.c') 76 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_xclass.c') 77 pcre_srcs += abtor_glob(abtor_path('pcre_8.10/'), 'pcre_try_flipped.c') 78 79 ################################################## 80 ## Wrapper 81 wrapper_incs_dir = [] 82 wrapper_incs_dir.append(abtor_path('pcre_8.10')) 83 wrapper_incs_dir.append(abtor_path('Source/Include')) 84 wrapper_incs_dir.append(abtor_path('Source/CParse')) 85 wrapper_incs_dir.append(abtor_path('Source/DOH')) 86 wrapper_incs_dir.append(abtor_path('Source/Modules')) 87 wrapper_incs_dir.append(abtor_path('Source/Preprocessor')) 88 wrapper_incs_dir.append(abtor_path('Source/Swig')) 89 90 wrapper_incs = [] 91 wrapper_incs += abtor_glob(abtor_path('Source/Include/'), '*.h') 92 wrapper_incs += abtor_glob(abtor_path('Source/CParse'), '*.h') 93 wrapper_incs += abtor_glob(abtor_path('Source/DOH'), '*.h') 94 wrapper_incs += abtor_glob(abtor_path('Source/Modules'), '*.h') 95 wrapper_incs += abtor_glob(abtor_path('Source/Preprocessor'), '*.h') 96 wrapper_incs += abtor_glob(abtor_path('Source/Swig'), '*.h') 97 98 wrapper_srcs = [] 99 wrapper_srcs += abtor_glob(abtor_path('Source/CParse'), '*.c') 100 wrapper_srcs += abtor_glob(abtor_path('Source/DOH'), '*.c') 101 wrapper_srcs += abtor_glob(abtor_path('Source/Modules'), '*.cxx') 102 wrapper_srcs += abtor_glob(abtor_path('Source/Preprocessor'), '*.c') 103 wrapper_srcs += abtor_glob(abtor_path('Source/Swig'), '*.c') 104 105 wrapper_libs_dir = [] 106 #wrapper_libs_dir.append(abtor_path('pcre/pcre-swig-install/lib')) # 這個不需要了 107 108 abtor_ccxx_library( 109 name = 'pcre', 110 valid = True, 111 link_style = 'static', 112 defines = ['DLL_EXPORT'], 113 include_dirs = pcre_incs_dir, 114 headers = pcre_incs, 115 srcs = pcre_srcs, 116 lib_dirs = [], 117 link_libs = [], 118 linux_deps = [], 119 mac_deps = [], 120 ) 121 122 abtor_ccxx_library( 123 name = 'ccache', 124 valid = True, 125 link_style = 'static', 126 include_dirs = wrapper_ccache_incs_dir, 127 headers = wrapper_ccache_incs, 128 srcs = wrapper_ccache_srcs, 129 lib_dirs = wrapper_libs_dir, 130 link_libs = ['pcre'], 131 linux_deps = ['dl','pcre','z'], 132 mac_deps = ['dl','pcre','z'], 133 ) 134 135 abtor_ccxx_binary( 136 name = 'autoWrapper', 137 valid = True, 138 include_dirs = wrapper_incs_dir, 139 headers = wrapper_incs, 140 srcs = wrapper_srcs, 141 lib_dirs = wrapper_libs_dir, 142 link_libs = ['pcre'], 143 linux_deps = ['dl','pcre','z'], 144 mac_deps = ['dl','pcre','z'], 145 )View Code
使用命令生成VS2015工程(abtorw.bat project vs2015 -t windows -a x64 -v -V)如下: