生成makefile中的所有目标

时间:2016-08-09 07:48:32

标签: makefile

我有Makefile:

INC=-I/usr/lib/boost_1_61_0
PYTHON_VERSION = 2.7
PYTHON_INCLUDE = /usr/include/python$(PYTHON_VERSION)

# location of the Boost Python include files and library
MINIREADER_INC = ./../../hdr
BOOST_INC = /usr/lib/boost_1_61_0
BOOST_LIB = /usr/lib/boost_1_61_0/stage/lib

TARGET = LoggerTestModule

$(TARGET).o: $(TARGET).cpp
        g++ -I$(PYTHON_INCLUDE) -I$(BOOST_INC) -I$(MINIREADER_INC) -fPIC -c $(TARGET).cpp --std=c++14 -g3

$(TARGET).so: $(TARGET).o
        g++ -shared -Wl,--export-dynamic $(TARGET).o ../../Release/src/Logger.o -L$(BOOST_LIB) -lboost_python -L/usr/lib/python$(PYTHON_VERSION)/config -lpython$(PYTHON_VERSION) -o $(TARGET).so --std=c++11 -g3

当运行make -f Makefile时,只生成目标文件,如何更改makefile以生成“对象和库文件”?

谢谢

2 个答案:

答案 0 :(得分:1)

添加假目标并将其放在其他目标之前,这是默认目标:

...
TARGET = LoggerTestModule

.PHONY: all

all: $(TARGET).o $(TARGET).so

$(TARGET).o: $(TARGET).cpp
        g++ -I$(PYTHON_INCLUDE) -I$(BOOST_INC) -I$(MINIREADER_INC) -fPIC -c $(TARGET).cpp --std=c++14 -g3
...

说明: all是默认目标(Makefile中的第一个非特殊目标)并取决于$(TARGET).o $(TARGET).so。因此,我们在未指定目标的情况下调用make,将构建all,并在需要时重建其所有先决条件。将其声明为.PHONY特殊目标的先决条件告诉make重建它,即使偶然存在名为all的文件。

答案 1 :(得分:0)

摆脱对象文件的规则,make已经知道如何构建它。您可能还应该重新构建您的变量以使它们与用于链接的内置规则对齐,然后您可以将其回收

TARGET := LoggerTestModule

PYTHON_VERSION := 2.7
PYTHON_INCLUDE := /usr/include/python$(PYTHON_VERSION)
MINIREADER_INC := ./../../hdr
BOOST_INC      := /usr/lib/boost_1_61_0
BOOST_LIB      := /usr/lib/boost_1_61_0/stage/lib

CPPFLAGS := -I$(PYTHON_INCLUDE) -I$(MINIREADER_INC) -I$(BOOST_INC)
CXXFLAGS := -fPIC -std=c++14 -g3
LDFLAGS  := -L$(BOOST_LIB) -L/usr/lib/python$(PYTHON_VERSION)/config
LDLIBS   := -lboost_python -lpython$(PYTHON_VERSION)

$(TARGET).so: CC := $(CXX)
$(TARGET).so: LDFLAGS += -shared -Wl,--export-dynamic 
$(TARGET).so: $(TARGET).o ../../Release/src/Logger.o
    $(LINK.o) $^ $(LDLIBS) -o $@