我有一个项目,我们称之为 AB,它看起来如下:
/path/to/<br>
---|dpdk-stable-17.05.1/...<br>
---|AB/<br>
------|main.cpp<br>
------|Makefile<br>
------|dir1/<br>
----------|c1.c<br>
----------|c2.c<br>
----------|c3.c<br>
----------|h1.h<br>
----------|Makefile<br>
------|dir2/<br>
----------|h2.h<br>
----------|cpp1.cpp<br>
----------|cpp2.cpp<br>
----------|Makefile<br>
我已经用 make install 成功编译了 dpdk。
我正在尝试创建 dir1.a 和 dir2.a 并与 main.cpp 一起构建,当然 DPDK 库是一个“AB”图像文件。
AB 中的 Makefile(主 makefile)如下所示:
>DPDK_VER=dpdk-stable-17.05.1
>
>RTE_SDK=$(shell pwd | sed -n 's/AB.*//p')/$(DPDK_VER)<br>
>RTE_TARGET=build
>
>include $(RTE_SDK)/mk/rte.vars.mk
>
>XXFLAGS := $(CFLAGS) -I../dir1/ -g<br>
>CXXFLAGS += -std=c++1y -D__STDC_LIMIT_MACROS -D__STDC_FORMAT_MACROS<br>
>CFLAGS += -g -O0 -std=gnu99 -Wall -Wno-unused-value<br>
>LDLIBS += -lfuse -lstdc++ --start-group -ldir1 -ldir2
>
>LDFLAGS += --end-group
>
>APP = AB
>
>SRCS-y := main.cpp
>
>OBJS-y := main.o
>
>SRCS-y := $(patsubst %.cpp,%.c,$(SRCS-y))<br>
>OBJS-y := $(patsubst %.o,obj/%.o,$(OBJS-y))
>
>DIRS-y = <br>
>DIRS-y += dir1<br>
>DIRS-y += dir2
>
>.PHONY: dirs-y $(DIRS-y)
>
>include $(RTE_SDK)/mk/rte.subdir.mk<br>
>include $(RTE_SDK)/mk/rte.extapp.mk
>
>.PHONY: clean<br>
>clean:<br>
> rm -rf *.o build/*.o build/$(APP)
dir1 中的 Makefile 看起来:
>DPDK_VER=dpdk-stable-17.05.1
>
>RTE_SDK=$(shell pwd | sed -n 's/AB.*//p')/$(DPDK_VER)<BR>
>RTE_TARGET=build
>include $(RTE_SDK)/mk/rte.vars.mk
>
>export RTE_OUTPUT=$(shell pwd)/../build/
>
>CXXFLAGS := $(CFLAGS) -g<BR>
>CXXFLAGS += -std=c++1y -D__STDC_LIMIT_MACROS -D__STDC_FORMAT_MACROS -lgnustl_shared<br>
>CFLAGS += -g -O0 -std=gnu99 -Wall -Wno-unused-value -I../dir2
>
>LIB = dir1.a
>
>SRCS-y := c1.c c2.c c3.c<br>
>OBJS-y := c1.o c2.o c3.o
>
>SRCS-y := $(patsubst %.cpp,%.c,$(SRCS-y))<br>
>OBJS-y := $(patsubst %.o,obj/%.o,$(OBJS-y))
>
>include $(RTE_SDK)/mk/rte.extlib.mk
>
>.PHONY: all<br>
> all
>
>.PHONY: clean<br>
>clean:<br>
> rm -rf *.o *.a ../build/lib/$(LIB)'
dir2 中的 Makefile 看起来:
>DPDK_VER=dpdk-stable-17.05.1
>
>RTE_SDK=$(shell pwd | sed -n 's/AB.*//p')/$(DPDK_VER)<br>
>RTE_TARGET=build
>
>include $(RTE_SDK)/mk/rte.vars.mk
>
>export RTE_OUTPUT=$(shell pwd)/../build/
>
>CXXFLAGS := $(CFLAGS) -g<br>
>CXXFLAGS += -std=c++1y -D__STDC_LIMIT_MACROS -D__STDC_FORMAT_MACROS -lgnustl_shared -I../dir1 -I.<br>
>CFLAGS += -g -O0 -std=gnu99 -Wall -Wno-unused-value<br>
>
>LIB = dir1.a
>
>SRCS-y := cpp1.cpp cpp2.cpp<br>
>OBJS-y := cpp1.o cpp2.o
>
>SRCS-y := $(patsubst %.cpp,%.c,$(SRCS-y))<br>
>OBJS-y := $(patsubst %.o,obj/%.o,$(OBJS-y))
>
>include $(RTE_SDK)/mk/rte.extlib.mk
>
>.PHONY: all<br>
> all
>
>.PHONY: clean<br>
>clean:<br>
> rm -rf *.o *.a ../build/lib/$(LIB)
制作输出是:
== Build /dir1
CC c1.o
CC c2.o
CC c3.o
AR dir1.a
INSTALL-LIB dir1.a
== Build /dir2
g++ -m64 -pthread -march=native -DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 - DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 -I/path/to/AB/build/include -I/path/to/dpdk-stable-17.05.1/build/include -include /path/to/dpdk-stable-17.05.1/build/包括/rte_config.h -g -std=c++1y -D__STDC_LIMIT_MACROS -D__STDC_FORMAT_MACROS -lgnustl_shared -I../dir1 -I。-c -o cpp1.o cpp2.cpp
g++ -m64 -pthread -march=native -DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 -I/path/to/AB/build/include -I/path/to.包括 -include /path/to/dpdk-stable-17.05.1/build/include/rte_config.h -g -std=c++1y -D__STDC_LIMIT_MACROS -D__STDC_FORMAT_MACROS -lgnustl_shared -I../dir1 -I。-c -o cpp2.o cpp2.cpp
AR dir2.a
INSTALL-LIB dir2.a
/path/to/dpdk-stable-17.05.1/mk/internal/rte.install-post.mk:98:警告:覆盖目标_postinstall'<br> /path/to/dpdk-stable-17.05.1/mk/internal/rte.install-post.mk:75: warning: ignoring old recipe for target
_postinstall 的配方'
/path/to//dpdk-stable-17.05.1/mk/internal/rte.clean-post.mk:61:警告:覆盖目标_postclean'<br> /path/to//dpdk-stable-17.05.1/mk/internal/rte.clean-post.mk:38: warning: ignoring old recipe for target
_postclean' 的配方
/path/to//dpdk-stable-17.05.1/mk/internal/rte.build-post.mk:38:警告:覆盖目标_postbuild'<br> /path/to/dpdk-stable-17.05.1/mk/internal/rte.build-post.mk:38: warning: ignoring old recipe for target
_postbuild'的配方
/path/to/AB/Makefile:40:警告:覆盖目标clean'<br> /path/to/dpdk-stable-17.05.1/mk/rte.app.mk:308: warning: ignoring old recipe for target
清洁配方'
g++ -m64 -pthread -march=native -DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 -I/path/to/AB/build/include - .1/build/include -include /path/to/dpdk-stable-17.05.1/build/include/rte_config.h -I../dir1/ -g -std=c++1y -D__STDC_LIMIT_MACROS -D__STDC_FORMAT_MACROS -c -o main.o /path/to/AB/main.cpp
LD AB
== Build /path/to/AB/dir1
make[2]: * 没有规则来制作目标c1.o', needed by
dir1.a'。>停下来。
make[1]: * [dir1] 错误 2
make: *** [all] 错误 2
dir.a dir2.a 和 AB 镜像都创建好了!
但是:
1)为什么make最后会回到Build dir1并宣布dir1.o缺少c1.o?
2)如何摆脱“警告:忽略目标'XXX'的旧配方”?
谢谢!