转载请注明出处:http://www.cnblogs.com/superbi/p/5482516.html

到目前为止,网络和官网上并没有关于libxls在windows下支持中文的教程,也没有现成的二进制文件。

想直接得到结果的请直接拉到最后获取成果,想自己以后遇到类似问题不用焦虑的请慢慢往下看

xls的第三方库目前能找到的只有libxl、libxls、xlslib。

libxl是商业的,对我来说直接过滤掉。

libxls只能读,xlslib只能写,对我来说知足了。

我也想能有一个跨平台的开源库能对xls进行读写,竟然没找到。

那就自己动手把,libxls和xlslib合并之后就能达到目的。

今天先来看看libxls。

首先libxls的文档不全,readme没有实质东西,最后找到INSTALL文档,如下:

BUILD AND INSTALL
================= * To build and install, for most environments:
./configure
make
make install * To build a native Win32 library under cygwin, use this configure:
CC='gcc -mno-cygwin' ./configure --host=mingw32 --build=mingw32 --with-iconv=no MAINTENANCE
=========== * To build versions for multiple architectures from the same place:
- create a directory for each arch: arch-<arch-name>
- call configure and make from within each directory * Do this when you update configure.in, or when there is an upgrade of autoconf/libtool versions:
./bootstrap
or:
autoreconf -v --install --force
then:
./configure * To build a binary distribution, use the following commands after
substituting the current version number (e.g., 0.30) for <version> and
the current computer architecture (e.g., i386) DESTDIR="$PWD/libxls-<version>-<arch>" make install
tar cvzf libxls-<version>-<arch>.tar.gz libxls-<version>-<arch>

可以看到linux下编译是相当简单,今天暂且不说,只是要注意是否有安装iconv。

windows环境的编译从INSTALL中

* To build a native Win32 library under cygwin, use this configure:
CC='gcc -mno-cygwin' ./configure --host=mingw32 --build=mingw32 --with-iconv=no

说明看出来我们需要使用cygwin来进行编译。

接下来进入正题:

1、首先下载cygwin,根据自己机器选择setup-x86.exe 或 setup-x86_64.exe

2、安装cygwin下的编译环境,仅仅为了编译libxls我们安装以下组件:

  Devel下的make、mingw64-i686-binutils、mingw64-i686-gcc-core、mingw64-i686-gcc-g++、mingw64-i686-win-iconv

3、然后把libxls源码放到cygwin中,建议放入/home/用户名/opt/下,第一次运行opt会不存在,需要手动新建。

4、在libxls的根目录(比如我的libxls根目录 c:/cygwin/home/fbi/opt/libxls)修改configure中的DEFS定义为DEFS="-DHAVE_CONFIG_H -D_GNU_SOURCE"(用来解决make时候的警告warning: implicit declaration of function 'asprintf' [-Wimplicit-function-declaration]),然后执行configure进行配置:

CC='i686-w64-mingw32-gcc' ./configure --host=i686-w64-mingw32 --build=i686-w64-mingw32

有的朋友就要问了,你的这个configure命令和libxls的INSTALL文档中提供的不一样,这是为啥呢??

只能说作者没有实时更新这个INSTALL文档,最新cygwin的gcc并不再支持“-mno-cygwin”选项,且host和build选项发生了变化。

具体的说明请见stackoverflow上此问题的第3个回答

我一开始就是卡在这个编译指令上,完全找不到方向,只能用“cygwin编译”关键字开始搜索,然后查找到“-mno-cygwin”这个选项是用来去除编译的程序对cygwin1.dll的依赖。

剩下就目的明显了,直接把“去除编译的程序对cygwin1.dll的依赖”翻译成英文然后搜索,主要关注stackoverflow上的帖子。

当然看帖子别只看楼主采用的答案,往往对自己有用的信息隐藏在其他回答里面,这种情况已经遇到几次了。

如何通过关键字一步一步逼近自己需要的信息需要长时间搜索的经验和认真查看搜索结果中的信息。一般疑难问题的线索在stackoverflow上都会有。

回到上面的configure指令,对比INSTALL中的会发现最后少了“--with-iconv=no”

熟悉iconv的朋友结合我的文章题目就会想到iconv是用来支持中文的,想不到的也不碍事,这取决于自己的经验和知识面。

既然iconv是用来做中文支持的,也就能解释为什么我要在cygwin中安装mingw64-i686-win-iconv组件。

、前面步骤正确的话,步骤4中的配置就会成功并生成必须的makefile文件,执行“make && make install”来进行编译安装了。

6、只要make没报错,我们就能在$(cygwin_home)/usr/local/libxls下即可看到安装成果($(cygwin_home)是指cygwin的安装目录)

安装成果中的bin目录只有xls2csv.exe,但是没法成功运行,原因就如提示一样:缺少iconv.dll,这个简单,利用everything搜索$(cygwin_home),拷贝usr\i686-w64-mingw32\sys-root\mingw\bin下的即可正常运行。

安装成果中的include目录没有什么疑问,调用dll需要的头文件目录。

安装成果中的lib目录只有libxlsreader.a和libxlsreader.la,并没有我们需要的dll和lib文件。不过可以利用.a文件最终转换出运行需要的dll、链接需要的lib及def文件。

从网上查资料得到此处能够通过gcc -shared能直接生成dll,但是我没成功,如果有朋友成功请指教,谢谢。

7、接下来我们利用安装成果中的libxlsreader.a来生成我们需要的dll、lib和def文件。

(1)在cygwin命令行下执行“i686-w64-mingw32-ar x libxlsreader.a”提取a中的.o文件

(2)然后利用.o文件来生成dll和def文件,具体命令如下:

i686-w64-mingw32-gcc -shared -o libxls.dll *.o -Wl,--export-all-symbols,--output-def,libxls.def -liconv

最后的-liconv很关键,否则会提示iconv相关接口未定义。

(3)利用dll和def通过visual studio的lib来得到链接需要的lib文件,打开visual studio 命令提示,然后切换目录到dl所在目录并执行“lib /machine:X86 /def:libxls.def”

找不到visual studio 命令提示的请看下面的2个图,图1中打开visual studio 命令提示需要右键用管理员模式打开,图2直接打开就行。

                    

8、到此大功告成,我们需要的libxls的动态库成功得到,中文也能正常支持了。

9、成果已上传网盘:http://pan.baidu.com/s/1miD4GVQ 密码:yxat

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*/

开源的excel读取库libxls在windows下的编译,且支持中文,全网首发的更多相关文章

  1. ACE在windows下的编译及配置(VS2010)

    ACE在windows下的编译及配置(VS2010) 分类:             -[小西南]-              2013-08-06 16:17     2354人阅读     评论( ...

  2. Windows下PythonQt编译(vs2015+Qt5.11.2+PythonQt 3.2)探索

    时间:2018年10月20日 笔者最近在做Qt方面的开发工作,需用到脚本程序对程序内部进行扩展,就很自然的想到了PythonQt,下面介绍PythonQt在Windows下的的安装编译心得,水平有限, ...

  3. 原创 C++应用程序在Windows下的编译、链接:第一部分 概述

    本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 cl.exe是windows平台下的编译器,link.ex ...

  4. windows 下 gvim/vim lua支持问题,neocomplete等插件支持

    此文是按照知乎 https://www.zhihu.com/question/29333426 "windows下vim的lua支持问题?" 一文汇总的解决方案. 题主提供了不错的 ...

  5. 【FFmpeg】Windows下FFmpeg编译

    由于FFmpeg是基于Linux开发的开源项目,源代码和Windows下最常见的Visual Studio提供的C/C++编译器不兼容,因此它不能使用MSVC++编译,需要在Windows下配置一个类 ...

  6. Windows下MinGW编译Qt4

    还真不是吹,这个问题折磨我一天……前些天转载了一篇关于<Eclipse+Qt开发环境设置>和<Eclipse+MinGW+Qt开发环境设置>两片文章,里面讲述了QT的开源版本q ...

  7. C++应用程序在Windows下的编译、链接(一)概述

    C++应用程序在Windows下的编译.链接(一)概述 本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 c ...

  8. [转]QGis2.9在windows下的编译以及二次开发包下载

    今天心血来潮,将QGis在github上的代码更新后,又编译了一下.留意到源代码包里面的INSTALL文件有更新,于是本次编译完全基于官方的编译说明.编译过程非常顺利,除了在CMake的第一次conf ...

  9. windows下rabbitmq-c编译(带openssl、无需MinGW)

    因为项目原因,需要使用到rabbitmq的c客户端库.首先,参见上一篇windows下openssl编译,如果已经使用cmake编译过了,则先delete cache(File-Delete Cach ...

随机推荐

  1. mac 下安装安卓模拟器

    mac下的安卓模拟器——bluestacks 下载:http://pan.baidu.com/s/1kVvZyYz 该安卓模拟器除了能网络下载apk,本地还能安装apk,但是与win版不同,安装不是那 ...

  2. c#中的interface abstract与virtual

    interface用来声明接口1.只提供一些方法规约,不提供方法主体  如  public interface IPerson {  void getName();//不包含方法主体  }2.方法不能 ...

  3. java异步上传图片

    第一步:引入需要的js <script src="/res/common/js/jquery.js" type="text/javascript"> ...

  4. Deep Learning 学习随记(七)Convolution and Pooling --卷积和池化

    图像大小与参数个数: 前面几章都是针对小图像块处理的,这一章则是针对大图像进行处理的.两者在这的区别还是很明显的,小图像(如8*8,MINIST的28*28)可以采用全连接的方式(即输入层和隐含层直接 ...

  5. 搞一个app需要多久?

    //转载文章,看后有感 我有些尴尬地拿着水杯,正对面坐着来访的王总,他是在别处打拼的人,这几年据说收获颇丰,见移动互联网如火如荼,自然也想着要进来干一场,尽管王总从事的行当也算跟IT沾边,但毕竟太长时 ...

  6. ITEXTSHARP学习整理

    学习的版本iTextSharp.5.5.5. 关于获取PDF中的图片资源 /// <summary> /// 将PDF中的图片资源转换成二进制 /// </summary> / ...

  7. Spring 创建bean的模式

    在默认情况下,spring创建bean是单例模式 scope="singleton ",还有一种方式为多例模式[prototype]     scope          sing ...

  8. 【BZOJ2809】【splay启发式合并】dispatching

    Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级. ...

  9. Perl中级第四章课后习题

    1.下列表达式各表示什么不同的含义: $ginger->[2][1] ${$ginger[2]}[1] $ginger->[2]->[1] ${$ginger->[2]}[1] ...

  10. CentOS6.5升级为CentOS7.0

    CentOS6.5升级为CentOS7.0 CentOS6.5升级为CentOS7 升级前: [root@localhost ~]# cat /proc/version  Linux version ...