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

如何在Makefile运行时动态设置依赖?j2objc编译场景求助

解决Make动态依赖j2objc生成的.m文件问题

以下是适配你需求的Makefile实现,核心解决动态获取j2objc生成的.m文件并作为依赖的问题:

# 替换为你实际要转换的单个Java文件路径
JAVA_SRC := src/org/path/to/packages/YourTarget.java
# 最终生成的静态库路径
STATIC_LIB := build/libYourLib.a
# 标记文件:记录j2objc转换完成状态,避免重复执行转换
J2OBJC_STAMP := build/.j2objc_done

# 默认目标:先执行j2objc转换,再递归调用Make编译打包
all: $(J2OBJC_STAMP)
	@$(MAKE) build_lib

# 编译打包目标,依赖所有.o文件
build_lib: $(STATIC_LIB)

# 静态库打包:将所有.o文件打包为静态库
$(STATIC_LIB): $(O_FILES)
	ar rcs $@ $(O_FILES)

# 动态获取build目录下所有.m文件,并生成对应的.o文件路径
M_FILES := $(shell find ./build -name '*.m')
O_FILES := $(M_FILES:.m=.o)

# 模式规则:将单个.m文件编译为.o文件
%.o: %.m
	j2objcc -c $< -o $@

# j2objc转换目标:仅当Java源文件更新时重新执行转换
$(J2OBJC_STAMP): $(JAVA_SRC)
	mkdir -p build
	# 执行j2objc转换,自动处理依赖,生成的文件存入build目录
	j2objc -d build -sourcepath src $(JAVA_SRC)
	touch $@

# 清理目标:删除build目录所有内容
clean:
	rm -rf build

关键逻辑说明

  1. 标记文件控制转换时机:用$(J2OBJC_STAMP)标记转换完成状态,只有当指定的Java源文件更新时,才会重新执行j2objc转换,避免重复操作。
  2. 递归Make解决动态依赖:默认目标先完成j2objc转换,再递归调用Make。此时build目录已生成所有.m文件,find命令能正确获取文件列表,生成对应的.o依赖。
  3. 模式规则批量编译:通过%.o: %.m模式规则,自动将每个.m文件编译为同名.o文件,无需逐个写编译命令。
  4. 静态库打包:最后用ar rcs命令将所有.o文件打包为静态库,rcs参数分别表示替换旧库内容、创建新库、生成索引。

使用方法

  1. 将JAVA_SRC替换为你实际要转换的Java文件路径。
  2. 将STATIC_LIB替换为你期望的静态库输出路径。
  3. 执行make命令即可完成转换、编译、打包全流程;执行make clean可清理所有生成文件。

内容的提问来源于stack exchange,提问作者Thieri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:05:16