1、首先下载cygwin,32位操作系统下载setup-x86.exe,64位电脑下载setup-x86_64.exe。
2、安装cygwin下的编译环境
编译x86链接库安装以下组件:
Devel下的make、mingw64-i686-binutils、mingw64-i686-gcc-core、mingw64-i686-gcc-g++、mingw64-i686-win-iconv
编译x64链接库安装以下组件:
Devel下的make、mingw64-x86_64-binutils、mingw64-x86_64-gcc-core、mingw64-x86_64-gcc-g++、mingw64-x86_64-win-iconv
cygwin的安装过程详见https://jingyan.baidu.com/article/9c69d48f9ecb0613c8024e5d.html。
3、下载libxls(1.4.0版本)源码:http://sourceforge.net/projects/libxls/ ,
然后把libxls源码放到cygwin的/home/Administrator目录中。
4、打开cygwin(默认当前路径为/home/Administrator),使用cd libxls命令将当前文件路径切换到源码所在文件夹,执行下面命令进行configure配置:
32位: CC='i686-w64-mingw32-gcc' ./configure --host=i686-w64-mingw32 --build=i686-w64-mingw32
64位: CC='x86_64-w64-mingw32-gcc' ./configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32
5、前面步骤正确的话,步骤4中的配置就会成功并生成必须的makefile文件,执行“make && make install”来进行编译安装了。
6、只要make没报错,我们就能在$(cygwin_home)/usr/local/libxls下即可看到安装成果($(cygwin_home)是指cygwin的安装目录)。
安装成果中的bin目录只有xls2csv.exe,但是没法成功运行,原因就如提示一样:缺少iconv.dll。
x86:拷贝\usr\i686-w64-mingw32\sys-root\mingw\bin下的iconv.dll;
x64:拷贝\usr\x86_64-w64-mingw32\sys-root\mingw\bin下的iconv.dll即可正常运行。
安装成果中的lib目录只有libxlsreader.a和libxlsreader.la,并没有我们需要的dll和lib文件。不过可以利用.a文件最终转换出运行需要的dll、链接需要的lib及def文件。
7、接下来我们利用安装成果中的libxlsreader.a来生成我们需要的dll、lib和def文件。
(1)x86:在cygwin命令行下执行“i686-w64-mingw32-ar x libxlsreader.a”提取a中的.o文件
x64:在cygwin命令行下执行“x86_64-w64-mingw32-ar x libxlsreader.a”提取a中的.o文件
(2)然后利用.o文件来生成dll和def文件,具体命令如下:
x86:i686-w64-mingw32-gcc -shared -o libxls.dll *.o -Wl,--export-all-symbols,--output-def,libxls.def -liconv
x64:x86_64-w64-mingw32-gcc -shared -o libxls.dll *.o -Wl,--export-all-symbols,--output-def,libxls.def -liconv
(3)利用dll和def通过visual studio的lib来得到链接需要的lib文件,打开visual studio 命令提示,然后切换目录到dl所在目录并执行:
x86:lib /machine:X86 /def:libxls.def
x64:lib /machine:X64 /def:libxls.def
8、至此大功告成,我们得到了x86和x64两个版本的libxls链接库(dll&lib),而且中文也能正常支持。接下来我们就可以愉快地封装和使用libxls库了~
PS:因为在vc中使用的时候会出现编译的问题,修改xlstypes.h最终文件如下(主要是因为linux和windows的差异):
#ifndef XLS_TYPES_INC
#define XLS_TYPES_INC
#include <stdint.h>
typedef unsigned char BYTE;
typedef uint16_t WORD;
typedef uint32_t DWORD;
#ifdef NO_ALIGN
typedef uint16_t WORD_UA;
typedef uint32_t DWORD_UA;
#else
#ifdef _WIN32
typedef __declspec(align(1)) uint16_t WORD_UA;
typedef __declspec(align(1)) uint32_t DWORD_UA;
#else
typedef uint16_t WORD_UA __attribute__ ((aligned (1))); // 2 bytes
typedef uint32_t DWORD_UA __attribute__ ((aligned (1))); // 4 bytes
#endif /* _WIN32 */
#endif /* NO_ALIGN */
#endif /* XLS_TYPES_INC*/</pre>
本文在 http://www.cnblogs.com/superbi/p/5482516.html 的基础上整理完善。