我有一个makefile,该makefile应该创建许多共享的目标文件。这些文件将是python模块。在所有目标中都有模块作为依赖项。我希望通过swig程序创建swig包装程序(.cpp)fil,将.cpp编译为.o目标文件,但是不会创建模块。
我的makefile如下:
CXXFLAGS :=$(CXXFLAGS) -fpic $(PYTHON3_CFLAGS)
LDLIBS :=$(LDLIBS) $(PYTHON3_LIBS)
SWIG=swig
SWIG_FLAGS:=-Wall -c++ -python #-DSWIG_TYPE_TABLE=fam #-external-runtime swigpyrun.h
IFACE_FILES += person.i
IFACE_FILES += parent.i
IFACE_FILES += child.i
WRAPPER_FILES = $(IFACE_FILES:.i=_wrap.cpp)
OBJS = $(WRAPPER_FILES:.cpp=.o)
MODULES = $(addprefix _, $(IFACE_FILES:.i=.so))
all:_person.so _child.so _parent.so #$(MODULES)
$(OBJS):$(WRAPPER_FILES)
$(MODULES):$(OBJS)
_%.so:%.cpp
$(CXX) -shared -o $@ $<
%_wrap.cpp:%.i
$(SWIG) $(SWIG_FLAGS) -o $@ $<
clean:
$(RM) $(WRAPPER_FILES)
$(RM) $(OBJS)
$(RM) $(MODULES)
当我运行它时,我得到:
$ make clean
rm -f person_wrap.cpp parent_wrap.cpp child_wrap.cpp
rm -f person_wrap.o parent_wrap.o child_wrap.o
rm -f _person.so _parent.so _child.so
$ make
swig -Wall -c++ -python -o person_wrap.cpp person.i
swig -Wall -c++ -python -o parent_wrap.cpp parent.i
swig -Wall -c++ -python -o child_wrap.cpp child.i
g++ -fpic `pkg-config --cflags python3` -c -o person_wrap.o person_wrap.cpp
g++ -fpic `pkg-config --cflags python3` -c -o parent_wrap.o parent_wrap.cpp
g++ -fpic `pkg-config --cflags python3` -c -o child_wrap.o child_wrap.cpp
$ make
make: Nothing to be done for 'all'.
因为我没有创建/链接.so文件,所以我必须做错了什么。但是我想念什么?
答案 0 :(得分:1)
您正在尝试从.cpp文件链接您的.so,但是您应该从.o文件链接:
_%.so: wrap_%.o
$(CXX) -shared -o $@ $<
答案 1 :(得分:1)
(我认为)您打算使管道运行
person.i => person_wrap.cpp => person.o => _person.so
但是请看以下两个规则:
$(MODULES):$(OBJS)
_%.so:%.cpp
$(CXX) -shared -o $@ $<
您要求_person.so
,第二条规则可以从_person.so
构建person.cpp
,但是没有person.cpp
,也没有构建方法。
_person.so
,并且具有先决条件person_wrap.o parent_wrap.o child_wrap.o
,可以构建 ,但是它没有命令,因此Make可以执行它-不执行任何操作
很难测试,但是我认为您要消除$(MODULES)
规则并进行一些修改:
_%.so:%_wrap.o
$(CXX) -shared -o $@ $<
将为您带来想要的效果。