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

使用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中:

  1. 连续的$(MAKE)会启动独立的子shell进程,导致前一次构建的状态无法被后续进程正确识别
  2. 同一脚本块内的多次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状态丢失:

  1. 创建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
  1. 给脚本添加执行权限:
chmod +x build_openssl.sh
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 21:40:54