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

如何用Makefile编译Trezor加密模块为静态库?编译报错求助

解决Trezor Crypto模块编译静态库时的头文件找不到问题

问题原因

编译报错是因为ed25519-donna/ed25519.h中引用的options.h位于同子目录下,但你的Makefile没有将该子目录添加到编译器的头文件搜索路径中,导致gcc无法找到这个文件。另外,原Makefile未提前创建build和lib目录,首次编译时也会因目录不存在报错。

修改后的Makefile

CC = gcc
AR = ar
# 添加ed25519-donna子目录到头文件搜索路径,保留原有编译参数
CFLAGS = -Wall -Werror -pedantic -I$(SRC_DIR)/ed25519-donna

SRC_DIR = trezor-firmware/crypto
BUILD_DIR = build
LIB_DIR = lib

# 提前创建编译所需目录
$(shell mkdir -p $(BUILD_DIR)/ed25519-donna $(LIB_DIR))

# 遍历crypto根目录及ed25519-donna子目录下的所有.c文件
SRC_FILES := $(wildcard $(SRC_DIR)/*.c)
SRC_FILES += $(wildcard $(SRC_DIR)/ed25519-donna/*.c)

# 生成对应目标文件路径
OBJ_FILES := $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SRC_FILES))

LIB_NAME = libcrypto.a
LIB_PATH = $(LIB_DIR)/$(LIB_NAME)

# 默认编译目标
all: $(LIB_PATH)

# 编译crypto根目录下的源文件
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
    $(CC) $(CFLAGS) -c $< -o $@

# 编译ed25519-donna子目录下的源文件
$(BUILD_DIR)/ed25519-donna/%.o: $(SRC_DIR)/ed25519-donna/%.c
    $(CC) $(CFLAGS) -c $< -o $@

# 打包生成静态库
$(LIB_PATH): $(OBJ_FILES)
    $(AR) rcs $@ $^

# 清理编译产物
clean:
    rm -rf $(BUILD_DIR) $(LIB_PATH)

关键修改点说明

  1. 添加头文件搜索路径:在CFLAGS中加入-I$(SRC_DIR)/ed25519-donna,让编译器能找到该子目录下的options.h等头文件。
  2. 包含子目录源文件:原Makefile仅遍历了crypto根目录的.c文件,需将ed25519-donna下的源文件也加入编译,否则静态库会缺失必要的目标文件。
  3. 提前创建目录:用$(shell mkdir -p ...)确保编译前build/ed25519-donna和lib目录存在,避免目录不存在的报错。
  4. 新增子目录编译规则:针对ed25519-donna下的.c文件单独编写规则,确保目标文件生成到对应子目录中。

验证方法

执行以下命令重新编译:

make clean
make

编译成功后,lib/libcrypto.a即为生成的静态库。

内容的提问来源于stack exchange,提问作者Harsh Singh Jadon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 23:47:19