做网站有哪些行业/关键词难易度分析
最近有一个需求在windows处理xls,所以就需要libxls这个库,调查了一下,基于C++的库的解析情况如下:
 
 所以最理想的就是Libxlsd个开源的方案
基于历史整理的 libxls 在 MinGW 下的编译步骤
前提条件
- 系统:Windows(你的情况)。
 - 工具:已安装 MSYS2(
C:\msys64)。 - 源码:libxls 1.6.3,已下载并解压到 
/Downloads/libxls-1.6.3/libxls-1.6.3。 - 目标:生成 
libxlsreader-8.dll,包括 Debug 版本。 
编译步骤
1. 准备 MSYS2 环境
-  
更新 MSYS2:
- 打开任意 MSYS2 终端(如 MSYS 终端):
C:\msys64\msys2_shell.cmd -msys - 更新系统:
pacman -Syu- 若提示关闭终端,关闭后重新打开并再次运行 
pacman -Syu。 
 - 若提示关闭终端,关闭后重新打开并再次运行 
 
 - 打开任意 MSYS2 终端(如 MSYS 终端):
 -  
安装基本工具:
- 在 MSYS 终端安装 autotools:
pacman -S autoconf automake libtool autoconf-archive make - 在 MinGW64 终端安装编译器:
C:\msys64\msys2_shell.cmd -mingw64 pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-make 
 - 在 MSYS 终端安装 autotools:
 
2. 配置源码
-  
进入源码目录:
- 在 MinGW64 终端:
cd /Downloads/libxls-1.6.3/libxls-1.6.3 
 - 在 MinGW64 终端:
 -  
生成
configure文件:- 切换到 MSYS 终端(autotools 需要 POSIX 环境):
C:\msys64\msys2_shell.cmd -msys cd /Downloads/libxls-1.6.3/libxls-1.6.3 - 运行:
autoreconf -i - 注意:若报错(如 
AX_CXX_COMPILE_STDCXX_11),确保autoconf-archive已安装。 
 - 切换到 MSYS 终端(autotools 需要 POSIX 环境):
 
3. 配置编译选项
-  
打开 MinGW64 终端:
C:\msys64\msys2_shell.cmd -mingw64 cd /Downloads/libxls-1.6.3/libxls-1.6.3 -  
配置 Release 版本(默认):
./configure --prefix=/mingw64 MAKE=mingw32-make -  
配置 Debug 版本:
- 添加调试符号并禁用优化:
./configure --prefix=/mingw64 MAKE=mingw32-make CFLAGS="-g -O0" CXXFLAGS="-g -O0" LDFLAGS="-g" - 可选:若需静态库:
./configure --prefix=/mingw64 --disable-shared --enable-static MAKE=mingw32-make CFLAGS="-g -O0" CXXFLAGS="-g -O0" 
 - 添加调试符号并禁用优化:
 
4. 编译
-  
清理旧构建(可选):
mingw32-make clean -  
编译:
mingw32-make- 注意:若遇到 
spawnv类型冲突错误,见下文“常见问题”。 
 - 注意:若遇到 
 
5. 安装
-  
安装库和头文件:
mingw32-make install -  
验证输出:
- 检查生成的库:
ls /mingw64/bin/libxlsreader-8.dll # 动态库 ls /mingw64/lib/libxlsreader.dll.a # 导入库 ls /mingw64/lib/libxlsreader.la # Libtool 元数据 - 检查头文件:
ls /mingw64/include/libxls - Debug 版本验证:
objdump -h /mingw64/bin/libxlsreader-8.dll | grep debug 
 - 检查生成的库:
 
常见问题及解决
1. make: command not found
 
- 现象:运行 
make时出错。 - 解决:
pacman -S mingw-w64-x86_64-make alias make='mingw32-make' # 临时别名- 或直接用:
./configure --prefix=/mingw64 MAKE=mingw32-make mingw32-make 
 - 或直接用:
 
也可以使用以下这个指令亲测:
CC='gcc' ./configure --build=mingw64 --prefix=/mingw64 --enable-static --enable-shared MAKE=mingw32-make && make install
 
2. AX_CXX_COMPILE_STDCXX_11 语法错误
 
- 现象:
./configure: line 19757: syntax error near unexpected token `,' - 解决: 
- 安装 
autoconf-archive:pacman -S autoconf-archive # 在 MSYS 或 MinGW64 终端 - 重新运行:
autoreconf -i # 在 MSYS 终端 
 - 安装 
 
3. spawnv 类型冲突
 
- 现象:
C:/msys64/mingw64/include/process.h:196:28: error: conflicting types for 'spawnv' - 解决: 
- 修改代码: 
- 编辑 
src/xls2csv.c、test/test.c、test/test2.c和cplusplus/main.cpp:- rval = (int) _spawnv(_P_WAIT, lt_argv_zero, (const char * const *) newargz); + rval = (int) _spawnv(_P_WAIT, lt_argv_zero, (char *const *) newargz); - 或移除 
unistd.h,替换为:#include <process.h> 
 - 编辑 
 - 禁用测试程序和 
xls2csv(推荐,若只需库):- 编辑 
Makefile.am:#bin_PROGRAMS = xls2csv #noinst_PROGRAMS = test_libxls test2_libxls #if HAVE_CXX11 #noinst_PROGRAMS += test_cpp #endif - 重新生成:
autoreconf -i # 在 MSYS 终端 ./configure --prefix=/mingw64 MAKE=mingw32-make mingw32-make 
 - 编辑 
 
 - 修改代码: 
 
4. Makefile.am 警告
 
- 现象:
Makefile.am:35: warning: variable 'xls2csv_SOURCES' is defined but no program or library has 'xls2csv' as canonical name - 解决: 
- 若禁用程序,忽略警告。
 - 若需编译程序,确保 
bin_PROGRAMS和noinst_PROGRAMS未注释。 
 
生成的库
- Release 版本: 
/mingw64/bin/libxlsreader-8.dll/mingw64/lib/libxlsreader.dll.a/mingw64/lib/libxlsreader.la
 - Debug 版本: 
- 同上,但文件包含调试符号(用 
-g -O0配置)。 
 - 同上,但文件包含调试符号(用 
 
使用示例
-  
C 调用(MinGW):
gcc -I/mingw64/include/libxls -L/mingw64/bin -lxlsreader test.c -o test.exe ./test.exe -  
Visual Studio:
- 需用 MSVC 重新编译,或将 
.dll放入项目目录并配置头文件。 
 - 需用 MSVC 重新编译,或将 
 
总结
以上步骤在你的环境下(MSYS2 MinGW64,路径 /Downloads/libxls-1.6.3/libxls-1.6.3)可生成 libxlsreader-8.dll。Debug 版本需添加 CFLAGS="-g -O0"。若只需库,禁用测试程序可简化流程。按步骤操作即可成功编译!
第二步骤就是将得到的dll转为.lib ,供visual studio引用
使用 dlltool 生成 .def 文件再转换
 (如果 reimp 不可用(我是没找到合适安装包和路径)可通过以下步骤手动转换)
- 生成 .def 文件:
 
gendef libxlsreader-8.dll
 
- 使用 dlltool 生成 .lib:
 
dlltool -d libxlsreader.def -D libxlsreader.dll -l libxlsreader.lib -k
