使用C语言+libxls读取.xlsx文件遇未定义引用错误的解决方法
问题描述
我尝试在Code::Blocks中使用C语言读取.xlsx格式的Excel文件,选用了libxls库。下载该库后,运行文件夹中的Test2.C文件,出现以下未定义引用错误:
||=== Build file: "no target" in "no project" (compiler: unknown) =|
D:\Palguna\C__language\xlsx_reading\main.o:main.c|| undefined reference toxls'| D:\Palguna\C__language\xlsx_reading\main.o:main.c|| undefined reference toxls_open_file'|
D:\Palguna\C__language\xlsx_reading\main.o:main.c|| undefined reference toxls_getError'| D:\Palguna\C__language\xlsx_reading\main.o:main.c|| undefined reference toxls_getWorkSheet'|
D:\Palguna\C__language\xlsx_reading\main.o:main.c|| undefined reference toxls_parseWorkSheet'| D:\Palguna\C__language\xlsx_reading\main.o:main.c|| undefined reference toxls_getError'|
D:\Palguna\C__language\xlsx_reading\main.o:main.c|| undefined reference toxls_showROW'| D:\Palguna\C__language\xlsx_reading\main.o:main.c|| undefined reference toxls_showCell'|
D:\Palguna\C__language\xlsx_reading\main.o:main.c|| undefined reference to `xls_showBookInfo'|
||error: ld returned 1 exit status|
||= Build failed: 10 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
原因分析
这类错误是链接器无法找到libxls库的二进制文件导致的——编译阶段能找到头文件所以没报错,但链接时缺少库文件的引用;同时错误提示中的"no target" in "no project"说明可能未通过Code::Blocks项目进行编译,而是直接编译单个文件。
解决步骤
1. 先编译libxls库生成二进制文件
如果下载的是libxls源码包,需要先编译出静态库(.a)或动态库(.dll):- 打开Code::Blocks,导入libxls的源码项目(若有
.cbp配置文件直接打开,无则新建项目并添加所有源码文件) - 编译库项目,生成的库文件通常会在项目的
bin或lib目录下。
- 打开Code::Blocks,导入libxls的源码项目(若有
2. 配置Code::Blocks项目的库路径与链接项
新建或打开包含Test2.C的Code::Blocks项目:- 点击菜单栏
Project->Build options... - 在
Search directories标签页:Compiler选项卡:添加libxls库的include文件夹路径(存放xls.h等头文件的目录)Linker选项卡:添加libxls库文件所在的目录路径
- 在
Linker settings标签页:- 在
Other linker options中输入-lxls(链接器会自动查找对应的库文件;如果是静态库,也可直接指定完整文件名如libxls.a)
- 在
- 若使用Windows动态库,需将
.dll文件放到可执行文件同目录,或系统环境变量包含的路径中。
- 点击菜单栏
3. 确保通过项目编译,而非单个文件
错误提示中的"no target" in "no project"说明直接编译单个.c文件会导致链接配置缺失:- 新建Code::Blocks的C项目,将Test2.C添加到项目中
- 完成上述库配置后,重新编译整个项目。
4. 验证函数与库版本匹配
检查Test2.C中调用的函数(如xls_open_file)是否存在于当前libxls版本的头文件中,部分旧版本函数名可能与新版本有差异,需确保代码与库版本兼容。
内容的提问来源于stack exchange,提问作者user19013072

