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
相关产品推荐
相关产品推荐

