3

我正在尝试制作一个将 .cpp 和 .swg 文件作为输入并使用 SWIG 创建一个 .so 文件的模块。问题是,我对 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 $@

除非两个先决条件都存在,否则此规则将不适用,这似乎不是您的想法。您必须将其拆分为两个规则:

%.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 回答