使用Make构建Android NDK版OpenSSL时反复提示需重新运行Make
Android NDK构建OpenSSL时Makefile反复提示“Please run the same make command again”的解决办法
问题场景
为Android NDK项目构建HTTPS依赖的OpenSSL时,编写Makefile实现自动化构建,但每次执行都会反复输出Please run the same make command again错误;而直接在控制台手动执行相同命令序列,却能正常完成编译。
原Makefile代码
androidVersion:=28 ndkRoot = $(shell pwd)/../android/ndk/25.2.9519653#https://developer.android.com/ndk/downloads/ opensslDir = ./openssl# Download from https://github.com/openssl/openssl/releases/latest ... openssl: export ANDROID_NDK_ROOT=$(ndkRoot) ; \ PATH=$$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$$PATH ; \ cd $(opensslDir); \ ./Configure android-arm -D__ANDROID_API__=$(androidVersion); \ $(MAKE) ; \ $(MAKE) ; \ $(MAKE)
构建输出片段
> make -B export ANDROID_NDK_ROOT=/home/me/a/../android/ndk/25.2.9519653 ; \ PATH=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH ; \ cd ./openssl; \ ./Configure android-arm -D__ANDROID_API__=28; \ make ; \ make ; \ make ; \ Configuring OpenSSL version 3.1.2 for target android-arm ... ************************************************** *** *** *** Please run the same make command again *** *** *** ************************************************** make[1]: Leaving directory '/home/me/a/openssl' # 重复执行多次后仍输出相同提示
原因分析
OpenSSL的构建系统会检测配置文件(如Configure、各类build.info)的修改时间,若检测到变化会触发重新配置并提示再次执行make。而在原Makefile中:
- 连续的
$(MAKE)会启动独立的子shell进程,导致前一次构建的状态无法被后续进程正确识别 - 同一脚本块内的多次make调用,会让OpenSSL的Makefile误判配置文件仍处于“未完成配置”状态,反复触发重新配置
手动执行时,所有命令在同一个shell会话中运行,状态能持续传递,因此不会出现重复提示。
解决方案
方案1:拆分配置与构建为独立Make目标
通过Make的依赖机制,让配置步骤仅执行一次,构建步骤基于已完成的配置执行:
androidVersion:=28 ndkRoot = $(shell pwd)/../android/ndk/25.2.9519653 opensslDir = ./openssl # 仅执行一次OpenSSL配置 openssl-config: export ANDROID_NDK_ROOT=$(ndkRoot) ; \ PATH=$$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$$PATH ; \ cd $(opensslDir); \ ./Configure android-arm -D__ANDROID_API__=$(androidVersion) # 构建依赖配置完成,仅执行一次make openssl: openssl-config export ANDROID_NDK_ROOT=$(ndkRoot) ; \ PATH=$$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$$PATH ; \ cd $(opensslDir); \ $(MAKE)
方案2:用Shell脚本封装构建逻辑
将所有步骤放到同一个shell会话中执行,避免子shell状态丢失:
- 创建
build_openssl.sh脚本:
#!/bin/bash set -e androidVersion=28 ndkRoot=$(pwd)/../android/ndk/25.2.9519653 opensslDir=./openssl export ANDROID_NDK_ROOT=$ndkRoot PATH=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH cd $opensslDir ./Configure android-arm -D__ANDROID_API__=$androidVersion make
- 给脚本添加执行权限:
chmod +x build_openssl.sh
- 修改Makefile调用脚本:
openssl: ./build_openssl.sh
方案3:强制使用已生成的Makefile(临时测试用)
在make调用时指定-f Makefile参数,跳过配置检查:
openssl: export ANDROID_NDK_ROOT=$(ndkRoot) ; \ PATH=$$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$$PATH ; \ cd $(opensslDir); \ ./Configure android-arm -D__ANDROID_API__=$(androidVersion); \ $(MAKE) -f Makefile
验证方式
执行make openssl,观察输出是否不再重复提示Please run the same make command again,并成功生成OpenSSL编译产物。
内容的提问来源于stack exchange,提问作者Cleardd
相关产品推荐
相关产品推荐

