2012-11-27 62 views
3

我試圖做一個模塊需要的.cpp和.swg文件作爲輸入,並創建使用痛飲一個.so文件。麻煩的是,我對makefile的瞭解不多,而且我不太確定我做錯了什麼。這是我的makefile:創建一個Makefile來構建swigged模塊

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 [email protected] 

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

當我運行此,讓說:

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

我究竟做錯了什麼?任何人都可以提出一個更好的方法來完成我想要做的事情嗎?

+0

對於我們這些不熟悉痛飲,你可以形容,如果你正在構建的手'file_processor.so',沒有讓你將採取哪些步驟? – Beta

+0

是的,通過手工構建這個文件我運行以下: – djpetti

+0

1)克++ -c -fPIC file_processor.cpp -o file_processor.o 2)痛飲-C++ -python file_processor.swg 3)的g ++ -c -fPIC file_processor_wrap .CXX -o file_processor_wrap.o 4)的g ++ -shared file_processor.o file_processor_wrap.o -o _file_processor.so甲corection上述生成文件,默認的目標應該開始_。請注意,可能有任何數量的.cpp文件,但最終只有1個.swg。 – djpetti

回答

1

1)默認規則:

_file_processor.so: %*.o 
    ... 

書面,這需要一個名爲 「%* O操作。」 的先決條件,這使得既不能找到,也沒有建立。我想你的意思是這樣的:

_file_processor.so: *.o 
    ... 

但隨後做會拉在所有現有文件.o - 如果任何人失蹤不用擔心。我建議:

OBJS = file_processor.o file_processor_wrap.o 

_file_processor.so: $(OBJS) 
    ... 

2)對象規則:

%.o: %.cxx %.cpp 
    $(CXX) $(CXXFLAGS) $? -o [email protected] 

此規則將不適用,除非存在的先決條件,這似乎沒有什麼你的想法。你必須把它分成兩個規則:

%.o: %.cxx 
    $(CXX) $(CXXFLAGS) $< -o [email protected] 

%.o: %.cpp 
    $(CXX) $(CXXFLAGS) $< -o [email protected] 

(模式規則不工作以同樣的方式爲普通規則)

3)小校:

swig -c++ -python file_processor.swg 

您是不是要找file_processor_wrap.swg?流量沒有任何意義,否則,因爲你會建設file_processor.cxx但從來沒有使用它。

+0

謝謝你抓到最後一個。你是對的。 (和幫助) – djpetti