1. 程式人生 > >SWIG 在 Windows 平臺上的編譯

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.c
6 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.c
22 pcre_try_flipped.c
View Code

  (6)在靜態庫工程中宣告三個巨集定義:DLL_EXPORTPCRE_STATICHAVE_CONFIG_H

2 配置 SWIG 可執行程式工程

  SWIG 編譯更簡單一些,把所有標頭檔案和原始檔都載入進來即可:

(1)配置標頭檔案目錄,載入所有:Include、CParse、DOH、Modules、Preprocessor、Swig

(2)配置原始檔目錄,載入所有:CParse、DOH、Modules、Preprocessor、Swig

(3)在可執行工程中新增兩個巨集定義:HAVE_CONFIG_HPCRE_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)如下: