首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VPATH不使用Makefile规则

VPATH不使用Makefile规则
EN

Stack Overflow用户
提问于 2012-07-31 21:54:38
回答 1查看 1.2K关注 0票数 0

我在Makefile中添加了另一个规则,尝试构建一个C共享库,该库使用SWIG来包装使用JNI的Java函数

额外的规则看起来像这样(基本上取自一个SWIG java示例)

代码语言:javascript
复制
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的编译规则如下:

代码语言:javascript
复制
.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语句如下所示:

代码语言:javascript
复制
VPATH = ../../pulse_IO/src ../../../g2/src
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-31 22:13:36

看看你的规则:

代码语言:javascript
复制
java: $(program_C_SRCS)
    ...
    $(CC) -c $(CFLAGS) $(JAVACFLAGS) $(program_C_SRCS) ...
    ...

假设program_C_SRCSfoo.c,路径为somewhere/foo.c。如果没有VPATH,这个规则根本不会运行,因为Make找不到foo.c。使用VPATH,Make会找到它,并知道真正的prereq是somewhere/foo.c。但是你的规则中有$(program_C_SRCS)

代码语言:javascript
复制
java: somewhere/foo.c
    ...
    $(CC) -c $(CFLAGS) $(JAVACFLAGS) foo.c ...
    ...

这会失败,因为(本地)没有foo.c

试试这个:

代码语言:javascript
复制
java: $(program_C_SRCS)
    ...
    $(CC) -c $(CFLAGS) $(JAVACFLAGS) $^ ...
    ...

(像$^这样的自动变量的使用是您之前规则有效的原因。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11741774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档