我正在尝试创建一个模块,它将 .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.
我究竟做错了什么?谁能建议一种更好的方法来完成我想做的事情?
最佳答案
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
但永远不会使用它。
关于c++ - 创建一个 Makefile 来构建 swigged 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13577017/