您的位置:首页 > 编程语言 > C语言/C++

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

2015-12-22 14:17 453 查看
这是一个实际项目中遇到的问题的解决方案, 当时已有的项目庞大而复杂, 使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: