0

我有一个项目,我们称之为 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 bydir1.a'。>停下来。
make[1]: *
[dir1] 错误 2
make: *** [all] 错误 2

dir.a dir2.a 和 AB 镜像都创建好了!
但是:
1)为什么make最后会回到Build dir1并宣布dir1.o缺少c1.o?
2)如何摆脱“警告:忽略目标'XXX'的旧配方”?

谢谢!

4

1 回答 1

0

该代码不太可重现,但我猜根本原因是主 Makefile 中有两个包含,rte.subdir.mk并且rte.extapp.mk.

尝试将其main.cpp放入src目录并仅rte.subdir.mk在主 Makefile 中使用,将所有应用程序构建功能移至src/Makefile...

于 2018-01-03T19:01:35.277 回答