makefile没有建立目标

时间:2019-04-25 11:45:03

标签: makefile

我有一个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文件,所以我必须做错了什么。但是我想念什么?

2 个答案:

答案 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 $@ $<

将为您带来想要的效果。