我在Makefile中添加了另一个规则,尝试构建一个C共享库,该库使用SWIG来包装使用JNI的Java函数
额外的规则看起来像这样(基本上取自一个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发布于 2012-07-31 22:13:36
看看你的规则:
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会找到它,并知道真正的prereq是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) $^ ...
...(像$^这样的自动变量的使用是您之前规则有效的原因。)
https://stackoverflow.com/questions/11741774
复制相似问题