编译7-Zip LZMA SDK时出现Undefined reference错误(Pop!_OS)
解决Pop!_OS下7-Zip LZMA SDK编译链接错误的方案
问题分析
出现的错误分为两类:
- 入口符号警告:
cannot find entry symbol _start,原因是链接时使用-nostartfiles选项跳过了标准C启动代码,系统无法识别程序入口。 - 未定义引用错误:缺失的
AesCbc_Decode_HW、Sha256_UpdateBlocks_HW等函数是SDK的硬件加速架构优化实现,对应的源码文件(如Aes_x86.c、Sha256_x86.c、LzFind_x86.c)未被编译进目标文件。
修复步骤
1. 移除-nostartfiles链接选项
该选项仅用于自定义程序入口的场景,普通可执行程序无需启用,直接删除链接命令中的-nostartfiles参数。
2. 编译所有架构相关的C文件
原脚本仅编译了常规.c文件,漏掉了架构优化类文件。修改编译循环,将这类文件纳入编译范围:
for FILE in $(ls "/home/hitesh/lzma2201/C" | egrep '\.c$');
若担心ls过滤遗漏,可直接指定架构文件补充:
ARCH_FILES="Aes_x86.c Sha256_x86.c LzFind_x86.c" for FILE in $(ls "/home/hitesh/lzma2201/C" | egrep '\.c$') $ARCH_FILES;
3. 使用gcc编译C源码
原脚本用g++编译C文件,可能触发C++风格的函数名修饰,导致与SDK的C函数调用不兼容。将编译命令中的g++替换为gcc:
gcc -Wall -std=c11 -g -c -D_7ZIP_ST -I"/home/hitesh/lzma2201/C" "/home/hitesh/lzma2201/C/"$FILE ;
4. 完整修复后的编译脚本
#!/bin/bash SDK_DIR="/home/hitesh/lzma2201/C" # 编译所有C文件(含架构优化文件) for FILE in $(ls "$SDK_DIR" | egrep '\.c$'); do gcc -Wall -std=c11 -g -c -D_7ZIP_ST -I"$SDK_DIR" "$SDK_DIR/$FILE" ; done # 链接生成可执行文件,移除-nostartfiles选项 g++ -std=c++14 -Wall -g *.o -o compress -L"$SDK_DIR"
若主程序为纯C代码,链接时也可替换为gcc。
验证
执行修改后的脚本,即可正常完成编译链接,消除所有错误与警告。
内容的提问来源于stack exchange,提问作者Master Hitesh
相关产品推荐
相关产品推荐

