最近呢要寫一個hyperscan的多模匹配,自然是使用C++來寫會更方便些啦蕾羊,而老板要求hyperscan搭配dpdk一塊使用。但由于dpdk源代碼使用的C語言開發(fā),其在example/l2fwd/目錄下提供的Makefile是不支持C++的笤昨,所以想要進(jìn)行C++和C的混和編程,就要做出相應(yīng)的修改握恳。根據(jù)網(wǎng)上的說法瞒窒,最起碼有兩種方案可以實(shí)現(xiàn)C++的編程。
第一類解決方案說需要修改兩個文件乡洼,文件路徑如下:
dpdk-16.07/mk/ineternal/rte.compile-pre.mk
dpdk-16.07/mk/toolchain/gcc/rte.vars.mk
其實(shí)呢我按照第一種方法修改過崇裁,結(jié)果還是不能支持C++,可能是在我的環(huán)境下行不通吧束昵!
由于是別人博客里的方法拔稳,所以還是提供一下博客原址比較好,感興趣的朋友也可以進(jìn)去看看具體的修改方法锹雏,鏈接如下:
用 g++ 編譯 dpdk
第二類解決方案相對簡單一點(diǎn)巴比,只需要修改Makefile就可以了,先給出dpdk本身提供的Makefile代碼:
ifeq ($(RTE_SDK), )
$(error "Please define RTE_SDK environment variable")
endif
#Default target, can be overriden by command line or environment
RTE_TARGET ?= x86_64-native-linuxapp-gcc
include $(RTE_SDK)/mk/rte.vars.mk
#binary name
APP = l2fwd
LDLIBS += -L/root/libnids-1.24/src/ /root/libnet-1.1.6/src/.libs/libnet.so.1 -lnids \
-lglib-2.0 -lgthread-2.0 /root/libpcap/release/libpcap.a
#all source are stored in SRCS-Y
SRCS-y := main.c
CFLAGS += -o0 -g
CFLAGS += $(WERROR_FLAGS) -Wno-error -Wno-unused-function
include $(RTE_SDK)/mk/rte.extapp.mk
下面給出為了添加對C++11編程的支持而修改后的Makefile礁遵,代碼如下:
ifeq ($(RTE_SDK), )
$(error "Please define RTE_SDK environment variable")
endif
#Default target, can be overriden by command line or environment
RTE_TARGET ?= x86_64-native-linuxapp-gcc
include $(RTE_SDK)/mk/rte.vars.mk
#binary name
APP = l2fwd
LDLIBS += -L/root/libnids-1.24/src/ /root/libnet-1.1.6/src/.libs/libnet.so.1 -lnids \
-lglib-2.0 -lgthread-2.0 /root/libpcap/release/libpcap.a
#all source are stored in SRCS-Y
SRCS-y := main.cpp
CPPFLAGS += -std=gnu++11
CFLAGS += -o3
CFLAGS += $(WERROR_FLAGS) -Wno-error -Wno-unused-function
LDFLAGS += -lstdc++
include $(RTE_SDK)/mk/rte.extapp.mk
其實(shí)呢修改Makefile也有好幾種修改方案轻绞,我提供的Makefile修改方案參考自下面的一篇博客:
How to code for DPDK with C++
沒錯,本篇博客都是別人的東西佣耐,我只是一名搬運(yùn)工政勃,但有一點(diǎn)要說明的是本博客中修改Makefile的方法是我花了好些功夫才找到的,所以想著貢獻(xiàn)出來給大家兼砖,并不是為了純粹寫博客而寫博客奸远,我沒那么閑。