DPDK编译到独立C++工程的一个方法

这是一个实际项目中遇到的问题的解决方案, 当时已有的项目庞大而复杂, 使用g++编译, 需要用到dpdk而dpdk的编译有自己的一套框架, 把产品编译脚本全部套进去显然是不现实并且工作量太大. 下面给的是一个操作示例描述了如何编译, 如果有更好的方法也请告诉我~


1: 首先把用到dpdk的相关c文件(dpdk默认不支持c++编译)编译为.o或者.a

ifeq ($(RTE_SDK),)
$(error "Please define RTE_SDK environment variable")
endif

# Default target, can be overridden by command line or environment
RTE_TARGET ?= x86_64-native-linuxapp-gcc

include $(RTE_SDK)/mk/rte.vars.mk

# all source are stored in SRCS-y
SRCS-y := dpdk_slave.c

CFLAGS += $(WERROR_FLAGS)

EXTRA_CFLAGS += -O0 -g -w -Wfatal-errors

#include $(RTE_SDK)/mk/rte.extlib.mk
include $(RTE_SDK)/mk/rte.extobj.mk

2: 在独立的c++工程把对应.a链接进去

这里的关键是 -Wl,--whole-archive 和 -Wl,--no-whole-archive, 如果不这样的话编译可能没问题, 但是程序运行结果不对, 比如dpdk找不到port之类的问题. 

#RTE_TARGET=x86_64-native-linuxapp-gcc
DPDK_LIB_DIR=$(RTE_SDK)/x86_64-native-linuxapp-gcc/lib

# 产品适配的dpdk部分代码
LDLIBS += ../slave/build/dpdk_slave.o

# 网卡驱动, 如果有其他类型网卡需要在这里添加, 否则程序可以编译运行但是找不到dpdk网卡, 为了保险目前把大部分的驱动不管是否用到都先直接加载
#  $(DPDK_LIB_DIR)/librte_pmd_virtio.a
#  $(DPDK_LIB_DIR)/librte_pmd_cxgbe.a 
LDLIBS += -lrt -pthread -ldl \
 -Wl,--whole-archive \
 $(DPDK_LIB_DIR)/librte_pmd_vmxnet3_uio.a \
 $(DPDK_LIB_DIR)/librte_pmd_e1000.a \
 $(DPDK_LIB_DIR)/librte_pmd_ixgbe.a \
 $(DPDK_LIB_DIR)/librte_pmd_af_packet.a \
 $(DPDK_LIB_DIR)/librte_pmd_bond.a \
 $(DPDK_LIB_DIR)/librte_pmd_fm10k.a \
 $(DPDK_LIB_DIR)/librte_pmd_enic.a \
 $(DPDK_LIB_DIR)/librte_pmd_i40e.a \
 $(DPDK_LIB_DIR)/librte_pmd_null.a \
 -Wl,--no-whole-archive 

# dpdk的库, 不然编译不过
LDLIBS += -Wl,--whole-archive \
 $(DPDK_LIB_DIR)/librte_mbuf.a \
 $(DPDK_LIB_DIR)/librte_eal.a \
 $(DPDK_LIB_DIR)/librte_mempool.a \
 $(DPDK_LIB_DIR)/librte_ring.a \
 $(DPDK_LIB_DIR)/libethdev.a \
 $(DPDK_LIB_DIR)/librte_malloc.a \
 $(DPDK_LIB_DIR)/librte_kvargs.a \
 $(DPDK_LIB_DIR)/librte_hash.a \
 $(DPDK_LIB_DIR)/librte_cmdline.a \
 -Wl,--no-whole-archive 


# lrt: dpdk clock_gettime need
dpdk_test : dpdk_test.cpp ../slave/build/dpdk_slave.o
	g++ -o dpdk_test -g -O0 dpdk_test.cpp $(LDLIBS)

clean: 
	rm -rf dpdk_test


你可能感兴趣的:(DPDK编译到独立C++工程的一个方法)