0

SWIG を使用して JNI を使用して Java の関数をラップする C 共有ライブラリを構築しようとする別のルールを Makefile に追加しました。

追加のルールは次のようになります (基本的に SWIG Java の例の 1 つから引用)

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 ファイルが、各 .o ファイルのコンパイルのために gcc を個別に呼び出すのではなく、gcc への 1 回の呼び出しとしてコンパイルされることに気付きました。

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
4

1 に答える 1

2

あなたのルールを見てください:

java: $(program_C_SRCS)
    ...
    $(CC) -c $(CFLAGS) $(JAVACFLAGS) $(program_C_SRCS) ...
    ...

program_C_SRCSfoo.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) $^ ...
    ...

(自動変数の使用は$^、以前のルールが機能した理由です。)

于 2012-07-31T14:13:36.257 に答える