You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:45:35