Ubuntu下问题 : undefined reference to `compress2‘ 的解决办法

本文解决Linux系统下编译ARC3D时遇到的两个问题:'undefined reference to `compress2' 和 'undefined reference to `MD5'。问题原因是缺少必要的链接库文件。通过添加libz.so和libcrypto.a库文件,成功解决了编译错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux 系统下经常出现 undefined reference to functionName 的问题,原因大都是缺少必须的链接库,导致编译的时候找不到相应的函数体。

最近在编译ARC3D的时候遇到两个问题: 

                                                       (1) undefined reference to `compress2‘ 

                                                       (2) undefined reference to `MD5‘ 

最终发现是因为缺少链接库文件所致。


函数`compress2‘  对应的库文件是 libz.so

函数MD5对应的库文件是 libcrypto .a

添加这两个库文件,问题得到了解决。






<think>我们正在解决一个链接错误:undefined reference to `lv_font_iconfont_36`。这个错误通常发生在编译链接阶段,表示编译器无法找到`lv_font_iconfont_36`这个符号的定义。 根据经验,这种错误常见于以下几种情况: 1. 没有将包含该符号定义的源文件或库文件添加到链接步骤中。 2. 在链接库时顺序不正确,导致符号解析失败。 3. 该符号确实没有被定义(例如,字体文件未正确生成或未包含在项目中)。 `lv_font_iconfont_36` 看起来是LVGL(Light and Versatile Graphics Library)中一个自定义字体图标的名称。通常,这种字体图标是通过LVGL提供的工具(如lv_font_conv)从SVG或TTF图标字体文件生成的。 ### 解决步骤 #### 1. 确认字体文件是否已正确生成 首先,确保你已经使用`lv_font_conv`工具生成了包含`lv_font_iconfont_36`的字体文件。生成命令可能如下: ```bash lv_font_conv --font FontAwesome.ttf --size 36 --format lvgl --range 0x20-0x7F --no-compress -o lv_font_iconfont_36.c ``` 生成的C文件(如`lv_font_iconfont_36.c`)应该包含字体的定义,包括`lv_font_iconfont_36`这个符号。 #### 2. 将生成的字体文件添加到项目中 确保生成的C文件(例如`lv_font_iconfont_36.c`)被添加到你的项目编译源文件中。例如,在Makefile或CMakeLists.txt中,需要包含这个文件。 例如,在Makefile中: ```makefile SRCS += lv_font_iconfont_36.c ``` #### 3. 检查链接顺序 如果字体文件已经正确编译,那么确保在链接时包含该目标文件。在链接库时,注意依赖顺序:被依赖的库应该放在依赖它的库之后。 #### 4. 检查头文件声明 在代码中使用`lv_font_iconfont_36`之前,需要包含声明该字体的头文件。通常,在生成的C文件中会有一个对应的头文件声明(或者生成工具同时生成了一个头文件)。如果没有,你可能需要在代码中声明: ```c extern lv_font_t lv_font_iconfont_36; ``` 然后在使用的地方包含这个声明。 #### 5. 检查字体名称拼写 确保在代码中使用的字体名称与生成的字体变量名称完全一致。注意大小写和下划线。 #### 6. 如果使用库,确保链接库 如果字体被编译到一个静态库(如`libmyfonts.a`)中,那么需要确保在链接时指定了这个库,并且链接器能够找到它。 #### 7. 重新编译整个项目 有时构建系统可能没有正确更新,尝试清理并重新编译整个项目。 ### 示例代码 在代码中,你应该这样使用该字体: ```c #include "lv_font_iconfont_36.h" // 假设生成了头文件 // 或者如果没有头文件,可以这样声明: // extern lv_font_t lv_font_iconfont_36; lv_obj_t * label = lv_label_create(lv_scr_act(), NULL); lv_label_set_style(label, LV_LABEL_STYLE_MAIN, &lv_style_plain_color); lv_label_set_text(label, MY_ICON_OK); // MY_ICON_OK 应该是图标对应的字符 lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0); ``` ### 常见问题 - **字体未生成**:可能因为工具未运行或生成失败,检查生成步骤。 - **文件未加入编译**:检查构建脚本,确保字体源文件被编译。 - **多个定义**:如果同一个字体被多个源文件定义,会导致重复定义错误,确保只在一个地方定义。 ### 参考 在解决链接错误时,可以参考其他类似问题的解决方法,例如: - 在引用[1]中,解决`FT_Has_PS_Glyph_Names`等未定义引用问题,通常需要链接正确的库(如`-lfreetype`)。同样,我们的问题可能是缺少字体文件的链接。 - 在引用[2]中,解决Windows socket相关未定义引用,需要链接`ws2_32`库。这提醒我们检查是否链接了必要的库。 对于我们的情况,如果字体文件已经正确编译并包含在项目中,那么不需要额外链接库(因为字体定义在目标文件中)。但如果字体被放入一个自定义库中,则需要链接该库。 §§相关问题§§ 1. 如何为LVGL生成自定义字体图标? 2. LVGL中如何使用自定义字体? 3. 如何解决LVGL编译中的其他常见链接错误?</think>### 解决 undefined reference to `lv_font_iconfont_36` 错误 该错误表示链接器无法找到 `lv_font_iconfont_36` 符号的定义。以下是系统化的解决方案: #### 1. **检查字体文件是否包含在编译中** - 确保包含 `lv_font_iconfont_36` 定义的C文件(如 `lv_font_iconfont_36.c`)已添加到编译列表 - **验证方法**: - 在Makefile/CMake中检查源文件列表 - 执行编译命令时确认 `.c` 文件被处理 - **修复示例** (CMake): ```cmake add_executable(your_target main.c lv_font_iconfont_36.c # 添加缺失的字体文件 ) ``` #### 2. **确认字体生成流程** - 该字体通常由 **LVGL字体转换工具** 生成 - **检查步骤**: 1. 重新运行字体生成命令(示例): ```bash lv_font_conv --font FontAwesome.ttf --size 36 --format lvgl \ --range 0x20-0x7F -o lv_font_iconfont_36.c ``` 2. 检查输出文件是否包含目标符号: ```c // 在 lv_font_iconfont_36.c 中应有类似定义 lv_font_t lv_font_iconfont_36 = { ... }; ``` #### 3. **检查头文件声明** - 确保在使用字体的代码中正确声明: ```c extern lv_font_t lv_font_iconfont_36; // 手动声明 ``` - 或包含自动生成的头文件: ```c #include "lv_font_iconfont_36.h" ``` #### 4. **验证链接顺序** - 确保包含字体定义的目标文件在链接命令中: ```makefile # Makefile 示例 OBJS = main.o lv_font_iconfont_36.o # 字体对象文件必须在列 your_target: $(OBJS) gcc -o $@ $^ -llvgl ``` #### 5. **清理并重新构建** - 旧构建产物可能导致问题: ```bash make clean # 清理旧对象文件 make # 完整重建 ``` #### 6. **检查字体兼容性** - 确认使用的LVGL版本与字体生成工具版本匹配 - 解决符号冲突: ```c // 如果存在重复定义,使用条件编译 #ifndef LV_FONT_ICONFONT_36_DEFINED #define LV_FONT_ICONFONT_36_DEFINED lv_font_t lv_font_iconfont_36 = {...}; #endif ``` ### 常见错误原因总结 | 原因 | 检查点 | 解决方案 | |------|--------|----------| | 文件未编译 | 构建脚本 | 添加 `.c` 文件到编译列表 | | 未生成字体 | 转换工具输出 | 重新运行字体生成命令 | | 声明缺失 | 源代码包含关系 | 添加 `extern` 声明或头文件 | | 链接顺序错误 | Makefile链接规则 | 调整目标文件顺序 | | 版本不匹配 | LVGL和工具版本 | 统一版本或重新生成 | > 提示:类似链接错误(如 `undefined reference to FT_Get_PS_Font_Info`)通常需要检查库链接[^1],而Windows socket错误(如 `__imp_WSAStartup`)需链接 `ws2_32` 库[^2]。但本例是自定义字体符号问题,重点检查生成和编译流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值