xlsxio全平台(x86、arm32、arm64 )编译、测试,使用编译脚本10分钟快速编译!
大家都知道编译xlsxio需要先编译各种依赖库(zlib、minzip、libexpat),如果再加上交叉编译,相当于需要重复的编译12次,这中间还不能出差错,确实挺麻烦的!
所以为了方便编译,写了这个编译脚本,只需要执行三次脚本(或着合成一个脚本)就可以一键的编译各种架构的xlsxio库!
一、创建编译文件夹xlsxio
1、复制脚本
脚本和文件地址(请私信)
已经将各个平台的编译流程集成到了脚本,直接将x86 arm32 arm64编译脚本复制到xlsxio文件夹
2、复制依赖库
xlsxio编译需要依赖各种库,为了避免编译过程中网络问题导致编译失败,需要手动下载库,并保存到xlsxio文件夹
2.1 下载zlib
地址:https://github.com/madler/zlib
说明:默认是使用zlib-1.2.13.tar.gz,如果对版本有要求需要修改编译脚本为对应的版本
2.2 下载libexpat
地址:https://github.com/libexpat/libexpat/releases/tag/R_2_7_1
说明:默认是使用expat-2.7.1.tar.gz,如果对版本有要求需要修改编译脚本为对应的版本
2.3 克隆xlsxio库
在xlsxio文件夹下执行克隆命令将xlsxio库克隆到本地
git clone https://github.com/brechtsanders/xlsxio.git
二、检查目录执行编译命令
第一步执行完后,xlsxio文件夹下面应该有下面的文件
此时执行不同架构的编译脚本即可编译相应架构的xlsxio动态库了,现在以build_xlsxio_x86_64.sh为例演示下x86下xlsxio动态库的编译
编译脚本的编译链可以根据实际情况进行修改,目前默认的三种编译链
x86系统:gccarm32:arm-linux-gnueabihfarm64:aarch64-linux-gnu
终端进入xlsxio文件夹
2.1 授予脚本可执行权限
chmod +x xlsxio
2.2 执行脚本
./build_xlsxio_x86_64.sh
脚本执行成功
最后生成的库在install_x86_64文件夹下面
三、使用测试程序测试
1、编写测试程序 test_xlsxio.c
#include <stdio.h>#include <stdlib.h>#include <string.h>#include "xlsxio_read.h"#include "xlsxio_write.h"// 测试数据结构
typedef struct {char name[50];int age;double salary;char department[30];
} Employee;// 测试数据Employee test_data[] = {{"张三", 28, 8500.50, "技术部"},{"李四", 32, 9200.00, "销售部"},{"王五", 25, 7800.75, "人事部"},{"赵六", 35, 12000.00, "管理部"},{"钱七", 29, 8900.25, "技术部"}};int test_write_excel(const char* filename) {printf("开始测试 Excel 写入功能...\n");// 创建 Excel 写入对象xlsxiowriter handle = xlsxiowrite_open(filename, "Sheet1");if (!handle) {printf("错误:无法创建 Excel 文件 %s\n", filename);return -1;}// 写入表头xlsxiowrite_add_cell_string(handle, "姓名");xlsxiowrite_add_cell_string(handle, "年龄");xlsxiowrite_add_cell_string(handle, "薪资");xlsxiowrite_add_cell_string(handle, "部门");xlsxiowrite_next_row(handle);// 写入数据int data_count = sizeof(test_data) / sizeof(Employee);for (int i = 0; i < data_count; i++) {xlsxiowrite_add_cell_string(handle, test_data[i].name);xlsxiowrite_add_cell_int(handle, test_data[i].age);xlsxiowrite_add_cell_float(handle, test_data[i].salary);xlsxiowrite_add_cell_string(handle, test_data[i].department);xlsxiowrite_next_row(handle);}// 关闭文件xlsxiowrite_close(handle);printf("Excel 文件写入完成:%s\n", filename);printf("写入了 %d 行数据(包含表头)\n", data_count + 1);return 0;}int test_read_excel(const char* filename) {printf("\n开始测试 Excel 读取功能...\n");// 打开 Excel 文件xlsxioreader xlsxioread = xlsxioread_open(filename);if (!xlsxioread) {printf("错误:无法打开 Excel 文件 %s\n", filename);return -1;}// 获取工作表xlsxioreadersheet sheet = xlsxioread_sheet_open(xlsxioread, NULL, XLSXIOREAD_SKIP_EMPTY_ROWS);if (!sheet) {printf("错误:无法打开工作表\n");xlsxioread_close(xlsxioread);return -1;}printf("从 Excel 文件读取的数据:\n");printf("%-10s %-6s %-10s %-10s\n", "姓名", "年龄", "薪资", "部门");printf("----------------------------------------\n");char* value;int row = 0;int col = 0;// 读取数据while (xlsxioread_sheet_next_row(sheet)) {row++;col = 0;// 跳过表头行if (row == 1) {// 读取并丢弃表头while ((value = xlsxioread_sheet_next_cell(sheet)) != NULL) {free(value);}continue;}// 读取数据行char name[50] = "";char age_str[20] = "";char salary_str[20] = "";char department[30] = "";// 读取姓名if ((value = xlsxioread_sheet_next_cell(sheet)) != NULL) {strncpy(name, value, sizeof(name) - 1);free(value);}// 读取年龄if ((value = xlsxioread_sheet_next_cell(sheet)) != NULL) {strncpy(age_str, value, sizeof(age_str) - 1);free(value);}// 读取薪资if ((value = xlsxioread_sheet_next_cell(sheet)) != NULL) {strncpy(salary_str, value, sizeof(salary_str) - 1);free(value);}// 读取部门if ((value = xlsxioread_sheet_next_cell(sheet)) != NULL) {strncpy(department, value, sizeof(department) - 1);free(value);}printf("%-10s %-6s %-10s %-10s\n", name, age_str, salary_str, department);}// 关闭文件xlsxioread_sheet_close(sheet);xlsxioread_close(xlsxioread);printf("Excel 文件读取完成\n");return 0;}int main() {const char* test_file = "test_employee.xlsx";printf("=== xlsxio 库测试程序 ===\n\n");// 测试写入if (test_write_excel(test_file) != 0) {printf("写入测试失败\n");return 1;}// 测试读取if (test_read_excel(test_file) != 0) {printf("读取测试失败\n");return 1;}printf("\n=== 所有测试完成 ===\n");printf("测试文件:%s\n", test_file);return 0;}
2、编写编译脚本compile_test.sh
#!/bin/bash# xlsxio 测试程序编译脚本# 支持不同架构的编译set -e# 默认参数
ARCH="x86_64"
CLEAN=false# 解析命令行参数
while [[ $# -gt 0 ]]; docase $1 in--arch)ARCH="$2"shift 2;;--clean)CLEAN=trueshift;;-h|--help)echo "用法: $0 [选项]"echo "选项:"echo " --arch ARCH 指定架构 (x86_64, arm, aarch64)"echo " --clean 清理编译文件"echo " -h, --help 显示帮助信息"exit 0;;*)echo "未知选项: $1"echo "使用 -h 或 --help 查看帮助"exit 1;;esacdone# 设置路径INSTALL_DIR="$(pwd)/install_${ARCH}"TEST_PROGRAM="test_xlsxio_${ARCH}"# 清理功能if [ "$CLEAN" = true ]; thenecho "清理编译文件..."rm -f test_xlsxio_* *.oecho "清理完成"exit 0fi# 检查安装目录if [ ! -d "$INSTALL_DIR" ]; thenecho "错误:找不到安装目录 $INSTALL_DIR"echo "请先运行对应架构的编译脚本:build_xlsxio_${ARCH}.sh"exit 1fi# 检查必要的库文件REQUIRED_LIBS=("$INSTALL_DIR/lib/libxlsxio_read.a""$INSTALL_DIR/lib/libxlsxio_write.a""$INSTALL_DIR/lib/libminizip.a""$INSTALL_DIR/lib/libexpat.a""$INSTALL_DIR/lib/libz.a")for lib in "${REQUIRED_LIBS[@]}"; doif [ ! -f "$lib" ]; thenecho "错误:找不到库文件 $lib"echo "请确保 xlsxio 库已正确编译"exit 1fidone# 设置编译器case $ARCH inx86_64)CC="gcc";;arm)CC="arm-linux-gnueabihf-gcc";;aarch64)CC="aarch64-linux-gnu-gcc";;*)echo "错误:不支持的架构 $ARCH"echo "支持的架构:x86_64, arm, aarch64"exit 1;;esac# 检查编译器if ! command -v $CC &> /dev/null; thenecho "错误:找不到编译器 $CC"if [ "$ARCH" != "x86_64" ]; thenecho "请安装交叉编译工具链"fiexit 1fiecho "开始编译 xlsxio 测试程序..."echo "架构: $ARCH"echo "编译器: $CC"echo "安装目录: $INSTALL_DIR"# 编译命令CFLAGS="-Wall -O2 -I$INSTALL_DIR/include"LDFLAGS="-L$INSTALL_DIR/lib"LIBS="-lxlsxio_write -lxlsxio_read -lminizip -lexpat -lz"echo "执行编译命令..."$CC $CFLAGS $LDFLAGS test_xlsxio.c $LIBS -o $TEST_PROGRAMif [ $? -eq 0 ]; thenecho "编译成功!"echo "可执行文件: $TEST_PROGRAM"echo ""echo "运行测试程序:"if [ "$ARCH" = "x86_64" ]; thenecho " ./$TEST_PROGRAM"elseecho " 将 $TEST_PROGRAM 复制到目标设备运行"echo " 目标设备需要设置库路径:"echo " export LD_LIBRARY_PATH=$INSTALL_DIR/lib:\$LD_LIBRARY_PATH"fi# 显示文件信息echo ""echo "文件信息:"ls -lh $TEST_PROGRAMfile $TEST_PROGRAMelseecho "编译失败!"exit 1fi
3、编译运行测试
./compile_test.sh./test_xlsxio_x86_64
测试结果
生成的文件
参考文章:xlsxio全平台(x86、arm32、arm64 )编译、测试,使用编译脚本10分钟快速编译! - IT技术视界