libxls库的编译以及基于Visual studio的配置
最近有一个需求在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
相关文章:

libxls库的编译以及基于Visual studio的配置
最近有一个需求在windows处理xls,所以就需要libxls这个库,调查了一下,基于C的库的解析情况如下: 所以最理想的就是Libxlsd个开源的方案 基于历史整理的 libxls 在 MinGW 下的编译步骤 前提条件 系统:Windows&#…...

OpenHarmony构建系统-GN与子系统、部件、模块理论与实践
理论 OpenHarmony源码体系 OpenHarmony的源码架构基于模块化设计,为了方便系统的功能的增加和裁剪,设计了基于GN构建的模块系统。整个模块可从大到小划分为产品(product)、领域/子系统集(domain)、子系统(sub system)、部件(component)、模块/组件(modu…...
kafka+spring cloud stream 发送接收消息
方案 1:使用旧版 StreamListener(适用于 Spring Cloud Stream < 2.x) 1. 添加依赖(pom.xml) <!-- Spring Cloud Stream Kafka Binder --> <dependency> <groupId>org.springframework.clo…...

使用ArcGIS Pro自动矢量化水系
在地理信息系统(GIS)领域,自动矢量化是一项至关重要的技术,它能够将栅格图像中的要素转换为矢量数据,从而方便后续的分析和处理。本文将详细介绍如何使用ArcGIS Pro自动矢量化水系,适用于那些颜色相对统一、…...

在PyCharm中运行Jupyter Notebook的.ipynb文件及其pycharm软件的基础使用
(注意需使用PyCharm专业版,学生、教师可以申请免费使用:https://www.jetbrains.com/shop/eform/students) 1. pycharm2024版汉化 https://blog.csdn.net/m0_74103046/article/details/144560999 2. pycharm中的python控制台和J…...

实验 Figma MCP + Cursor 联合工作流
开源项目 Figma-Context-MCP 介绍 使用此 Model Context Protocol 服务器授予 Cursor 对 Figma 文件的访问权限。 当 Cursor 可以访问 Figma 设计数据时,它比粘贴屏幕截图等其他方法更能准确地进行代码转化。 开源仓库: GLips/Figma-Context-MCP 具体…...
移植live555 上的 rtsp
一、V4L2视频采集模块(完整示例) #include <linux/videodev2.h> #include <sys/ioctl.h> #include <fcntl.h>// 初始化V4L2摄像头 int init_v4l2_camera(const char* dev_path, int width, int height) {int fd open(dev_path, O_RD…...
Web Worker终极优化指南:4秒卡顿→0延迟的实战蜕变
💡 导读:从4秒卡顿到丝滑响应 真实痛点场景:当斐波那契数列计算量达10亿次时,页面完全冻结4.2秒!通过Web Worker优化后,UI响应时间降至16ms以内。本文手把手带您实现性能蜕变! 一、Web Worker核…...

redis中的Lua脚本,redis的事务机制
lua脚本的特点 lua脚本可以操作redis数据库,并且脚本中的代码满足原子性,要么全部被执行,要么全部不执行 lua脚本的语法 脚本示例 lua脚本的草稿: 最终的lua脚本 lua脚本在java里调用的方法 RedisTemplete类里有一个方法&…...
CPU多级缓存与缓存一致性协议
CPU多级缓存与缓存一致性协议 CPU多级缓存和缓存一致性协议是计算机体系结构中优化性能与保证数据正确性的核心机制。以下从缓存层级设计、工作原理、一致性协议(如MESI)及其实现细节展开说明。 一、为什么需要多级缓存? CPU的计算速度远高…...

Apifox 增强 AI 接口调试功能:自动合并 SSE 响应、展示DeepSeek思考过程
在现代的API接口调试中,效率和精确性对于开发者和测试人员来说至关重要。Apifox,作为一款功能强大的API管理和调试工具,近年来不断提升其用户体验和智能化功能。最近,Apifox 推出了增强版的AI接口调试功能,其中包括自动…...

【电机控制】42步进电机+arduino:WHEELTEC_MS42DDC
轮趣科技 42步进电机arduino:WHEELTEC_MS42DDC 接线方式: WHEELTEC_MS42DDC有两个接口, 一端接口连接配套的DC电源,另外一端只需要用三根线,一根负极连接ardino 的GND,然后把该端口的tx和rx连接到arduino的rx和tx,下…...

使用LangChain构建第一个ReAct Agent
使用LangChain构建第一个ReAct Agent 准备环境 使用Anaconda 安装python 3.10 安装langchain、langchain_openai、langchain_community (安装命令 pip install XXX) 申请DeepSeek API:https://platform.deepseek.com/api_keys(也…...
萝卜头笔作文赏析
在遥远的无寻王国,有这么一支小小的笔诞生了,人们见它又短又小,于是就给它取名叫萝卜头笔。萝卜头笔渐渐长大了,除了身子变粗些,其他什么都没变。一天,萝卜头笔来到了深山老林,那里枝叶繁茂&…...

RT-Thread+STM32L475VET6——USB鼠标模拟
文章目录 前言一、板载资源二、具体步骤1.配置icm20608传感器2.打开CubeMX进行USB配置3. 配置USB3.1 打开USB驱动3.2 声明USB3.3 剪切stm32xxxx_hal_msp.c中的void HAL_PCD_MspInit(PCD_HandleTypeDef* hpcd)和void HAL_PCD_MspDeInit(PCD_HandleTypeDef* hpcd)函数至board.c3.…...
rust 安全性
Rust 是 静态类型(statically typed) 语言, 也就是说在编译时就必须知道所有变量的类型, 这一点将贯穿整个章节。 C/C的安全问题 内存的不正确访问引发的内存安全问题 由于多个变量指向同一块内存区域导致的数据一致性问题 由于…...
大模型驱动的围术期质控系统全面解析与应用探索
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 1.3 研究创新点 二、大模型技术与围术期管理概述 2.1 大模型技术原理与发展现状 2.2 围术期管理流程与挑战 三、大模型在术前的应用 3.1 病历内涵质控 3.2 智能医学问答与知识查询 3.3 疾病风险预测与评估 3.…...

中兴B863AV3.2-T/B863AV3.1-T2/B863AV3.1-T2K_电信高安_S905L3A-B_安卓9.0_线刷固件包
中兴B863AV3.2-T/B863AV3.1-T2/B863AV3.1-T2K_电信高安_S905L3A-B_安卓9.0_线刷固件包 B863AV3.2-T B863AV3.1-T2 已知可通刷贵州、江苏、贵州、北京、河南、陕西等省份。 线刷方法:(新手参考借鉴一下) 1、准备好一…...

Android Binder机制
Binder是IPC(进程间通信)的一种机制,它允许不同的应用或系统服务在不同的进程中安全地交换数据。Binder的核心原理是基于客户端-服务器模型(C/S架构)。 一、Binder的定义 1. Binder是Android中的一个类,它继承了IBind…...
【算法】初等数论
初等数论 模 取余,遵循尽可能让商向0靠近的原则,结果的正负和左操作数相同 取模,遵循尽可能让商向负无穷靠近的原则,结果的正负和右操作数相同 7/(-3)-2.3,产生了两个商-2和-3,取…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...