3

.cppファイルと.swgファイルを入力として受け取り、SWIGを使用して.soファイルを作成するモジュールを作成しようとしています。問題は、makefileについてあまりよく知らないことと、何が間違っているのか正確にはわからないことです。これが私のmakefileです:

CXX = g++
SWIG = swig
SWIGFLAGS = -c++ -python 
CXXFLAGS = -c -fpic -Wall #for debugging purposes
LDFLAGS = -shared

file_processor.so: %*.o
    $(CXX) $(LDFLAGS) $^

%.o: %.cxx %.cpp
    $(CXX) $(CXXFLAGS) $? -o $@

%.cxx: %.swg
    $(SWIG) $(SWIGFLAGS) $<

私がこれを実行すると、makeは次のように言います。

make: *** No rule to make target `%*.o', needed by `file_processor.so'.  Stop.

私は正確に何を間違っているのですか?誰かが私がやろうとしていることを達成するためのより良い方法を提案できますか?

4

1 に答える 1

1

1)デフォルトのルール:

_file_processor.so: %*.o
    ...

書かれているように、これには「%*。o」と呼ばれる前提条件が必要です。これは、Makeが検索もビルドもできません。私はあなたがこれを意味したと思います:

_file_processor.so: *.o
    ...

しかし、Makeは既存のすべての.oファイルをプルします。欠落しているファイルがあったとしても心配する必要はありません。私はお勧め:

OBJS = file_processor.o file_processor_wrap.o

_file_processor.so: $(OBJS)
    ...

2)オブジェクトルール:

%.o: %.cxx %.cpp
    $(CXX) $(CXXFLAGS) $? -o $@

このルールは、両方の前提条件が存在しない限り適用されません。これは、あなたが考えていることではないようです。これを2つのルールに分割する必要があります。

%.o: %.cxx
    $(CXX) $(CXXFLAGS) $< -o $@

%.o: %.cpp
    $(CXX) $(CXXFLAGS) $< -o $@

(パターンルールは、通常のルールとまったく同じようには機能しません。)

3)小さな修正:

swig -c++ -python file_processor.swg

意味file_processor_wrap.swgですか?フローは、構築file_processor.cxxしているが使用することはないため、それ以外の場合は意味がありません。

于 2012-11-27T16:11:51.503 に答える