makefile - 定义生成共享库的 makefile 规则

标签 makefile java-native-interface

我目前正在开发一个 JNI 项目,其中 C 部分使用我的 NanoPi 上的本地库。 header 的构建、用 C 语言实现并测试包装器工作得很好。现在我尝试将共享库支持添加到我的 make 文件中,但无法运行它。不幸的是,我是 Makefiles 的新手,到目前为止还找不到详细解释我所有需求的教程,以便我可以自己修复它。

下面您可以找到我到目前为止构建的 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)
$(Dynamic): $(OBJ)
        @echo "[Link (Dynamic)]" 
        @$(CC) -shared -Wl,-soname,libPca9685Native.so -o libPca9685Native.so.$(VERSION) -lpthread $(OBJ)

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)
tags:   $(SRC)
        @echo[ctags]
        @ctags $(SRC)
depend: 
        makedepend -Y $(SRC)

(动态)部分是新添加的部分。我每次尝试运行时都会收到消息 make:没有规则来制作所有人都需要的目标“libPca9685Native.so.2.0”。 输出对我来说很清楚。缺少创建 so 文件的规则,但我不知道如何添加该规则...... 非常感谢您的帮助。 问候彼得

最佳答案

这里:

all:    $(DYNAMIC)
$(Dynamic): $(OBJ)

Makefile 变量区分大小写(即使在 Windows 上使用 MinGW gnu make)。因此,您必须尊重大小写,否则 $(Dynamic) 无法正确评估。修复:

all:    $(DYNAMIC)
$(DYNAMIC): $(OBJ)

(请注意,您的 makefile 中可能还有其他问题)

关于makefile - 定义生成共享库的 makefile 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48402935/

相关文章:

c - 同一预处理器指令的值在一个文件中正确,但在另一个文件中错误

java - 在 Netbeans 中加载 DLL

android - 如何在Eclipse中配置javah工具

java - 需要在windows中交叉编译JNI库才能使用cygwin在linux中运行

c - makefile fatal error : no such file or directory,但文件位于当前目录

c - 我是否正确编写了这个 makefile?

c - 通过 make 将 GSL 链接到 C

java-native-interface - 使用 D 编写 Java 原生接口(interface)

java - 从 c++ (jni) 调用 java 函数根本不起作用

iphone - 为 iOS 和 XCode 4.3 交叉编译开源 c 库