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

Makefile生成JNI共享库报错:缺少目标构建规则求助

解决Makefile生成共享库的错误问题

你遇到的核心问题是Makefile变量大小写敏感:你定义了变量DYNAMIC,但在规则里写成了$(Dynamic)(首字母小写),导致Make找不到生成目标libPca9685Native.so.2.0的规则。

修正后的完整Makefile

DYN_VERS_MAJ=2
DYN_VERS_MIN=0
VERSION=$(DYN_VERS_MAJ).$(DYN_VERS_MIN)
DEBUG = -O3
CC = gcc
INCLUDE = -I/usr/local/include -I/usr/lib/jvm/java-1.8.0-openjdk-armhf/include -I/usr/lib/jvm/java-1.8.0-openjdk-armhf/include/linux
CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe -fPIC -Wformat=2
LDFLAGS = -L/usr/local/lib
LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm -lwiringPiPca9685
SRC = pwm_native_PCA9685Native.c
DYNAMIC=libPca9685Native.so.$(VERSION)
OBJ = $(SRC:.c=.o)
BINS =$(SRC:.c=)

all: $(DYNAMIC) libPca9685Native.so

# 修正变量大小写,同时添加依赖库链接参数
$(DYNAMIC): $(OBJ)
	@echo "[Link (Dynamic)]"
	@$(CC) -shared -Wl,-soname,libPca9685Native.so -o $@ $(OBJ) $(LDFLAGS) $(LDLIBS)

# 创建软链接,方便JNI调用时使用短文件名
libPca9685Native.so: $(DYNAMIC)
	@echo "[Create Symlink]"
	@ln -sf $< $@

driver: pwm_native_PCA9685Native.o
	@echo [link]
	@$(CC) -o $@ pwm_native_PCA9685Native.o $(LDFLAGS) $(LDLIBS)

.c.o:
	@echo [Compile] $<
	@$(CC) -c $(CFLAGS) $< -o $@

clean:
	@echo "[Clean]"
	@rm -f $(OBJ) *~ core tags $(BINS) $(DYNAMIC) libPca9685Native.so

tags: $(SRC)
	@echo [ctags]
	@ctags $(SRC)

depend:
	makedepend -Y $(SRC)

关键修改说明

  • 修复变量大小写问题:把规则中的$(Dynamic)改为$(DYNAMIC),让Make能正确匹配目标文件和生成规则。
  • 补充依赖库链接:原动态链接命令只加入了-lpthread,但你的项目依赖wiringPi系列库,所以将$(LDFLAGS)和$(LDLIBS)加入链接命令,避免运行时出现库缺失错误。
  • 添加软链接规则:JNI调用共享库时通常默认查找libXXX.so格式的短文件名,新增规则创建软链接指向带版本号的库文件,简化后续JNI配置。
  • 更新清理规则:将生成的共享库和软链接加入清理列表,确保编译目录可以完全清空。

后续测试提示

运行make后会生成libPca9685Native.so.2.0和软链接libPca9685Native.so。测试JNI调用时,需要将库所在路径添加到LD_LIBRARY_PATH环境变量,或者把库文件拷贝到系统默认库路径(如/usr/local/lib)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:05:15