如何用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)
关键修改点说明
- 添加头文件搜索路径:在
CFLAGS中加入-I$(SRC_DIR)/ed25519-donna,让编译器能找到该子目录下的options.h等头文件。 - 包含子目录源文件:原Makefile仅遍历了crypto根目录的.c文件,需将ed25519-donna下的源文件也加入编译,否则静态库会缺失必要的目标文件。
- 提前创建目录:用
$(shell mkdir -p ...)确保编译前build/ed25519-donna和lib目录存在,避免目录不存在的报错。 - 新增子目录编译规则:针对ed25519-donna下的.c文件单独编写规则,确保目标文件生成到对应子目录中。
验证方法
执行以下命令重新编译:
make clean make
编译成功后,lib/libcrypto.a即为生成的静态库。
内容的提问来源于stack exchange,提问作者Harsh Singh Jadon
相关产品推荐
相关产品推荐

