我在Makefile中添加了另一个规则,试图构建一个使用SWIG使用JNI包装Java函数的C共享库
附加规则看起来像这样(基本上取自一个SWIG java示例)
java: $(program_C_SRCS)
$(SWIG) -java $(SWIGOPT) $(INTERFACEPATH)
$(CC) -c $(CFLAGS) $(JAVACFLAGS) $(program_C_SRCS) $(ISRCS) $(CPPFLAGS) $(JAVA_INCLUDE)
$(JAVALDSHARED) $(CFLAGS) $(program_C_OBJS) $(IOBJS) $(JAVA_DLNK) $(LDFLAGS) -o $(JAVA_LIBPREFIX)$(TARGET)$(JAVASO)
javac *.java
我遇到的问题是我的VPATH似乎不再使用* .c文件了
我注意到这个规则导致所有.c文件编译为一次调用gcc而不是单独调用gcc来编译每个.o文件
我之前没有任何JNI的编译规则如下所示:
.PHONY: all clean
all: $(program_DEBUG_NAME) $(program_RELEASE_NAME)
# original rule to build library in src dir (no longer inc. in all)
$(program_NAME): $(program_C_OBJS)
$(LINK.c) -shared -Wl,-soname,$@ $^ -o $@
# new rules to build debug/release libraries and place them in relevant build
# dirs
$(program_DEBUG_NAME): $(DEBUG_OBJS)
$(DEBUG_LINK.c) -shared -Wl,-soname,$@ $^ -o $(BUILD_DIR)/debug/$@
$(program_RELEASE_NAME): $(RELEASE_OBJS)
$(RELEASE_LINK.c) -shared -Wl,-soname,$@ $^ -o $(BUILD_DIR)/release/$@
# rule to build object files (replaces implicit rule)
$(BUILD_DIR)/debug/%.o: %.c
$(DEBUG_LINK.c) $< -c -o $@
$(BUILD_DIR)/release/%.o: %.c
$(RELEASE_LINK.c) $< -c -o $@
这些与VPATH合作没问题
我的VPATH声明如下:
VPATH = ../../pulse_IO/src ../../../g2/src
答案 0 :(得分:2)
看看你的规则:
java: $(program_C_SRCS)
...
$(CC) -c $(CFLAGS) $(JAVACFLAGS) $(program_C_SRCS) ...
...
假设program_C_SRCS
为foo.c
,路径为somewhere/foo.c
。如果没有VPATH,则此规则根本不会运行,因为Make无法找到foo.c
。使用VPATH,Make找到它,并且知道真正的先决条件是somewhere/foo.c
。但是你的规则中有$(program_C_SRCS)
:
java: somewhere/foo.c
...
$(CC) -c $(CFLAGS) $(JAVACFLAGS) foo.c ...
...
此操作失败,因为没有foo.c
(本地)。
试试这个:
java: $(program_C_SRCS)
...
$(CC) -c $(CFLAGS) $(JAVACFLAGS) $^ ...
...
(使用像$^
这样的自动变量是你之前的规则有效的原因。)