DPDK编译到独立C++工程的一个方法
2015-12-22 14:17
453 查看
这是一个实际项目中遇到的问题的解决方案, 当时已有的项目庞大而复杂, 使用g++编译, 需要用到dpdk而dpdk的编译有自己的一套框架, 把产品编译脚本全部套进去显然是不现实并且工作量太大. 下面给的是一个操作示例描述了如何编译, 如果有更好的方法也请告诉我~
1: 首先把用到dpdk的相关c文件(dpdk默认不支持c++编译)编译为.o或者.a
2: 在独立的c++工程把对应.a链接进去
这里的关键是 -Wl,--whole-archive 和 -Wl,--no-whole-archive, 如果不这样的话编译可能没问题, 但是程序运行结果不对, 比如dpdk找不到port之类的问题.
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
相关文章推荐
- c/c++: uint8_t & uint16_t & int32_t etc.
- C++小题(一)
- 凯撒加解密算法C语言实现
- 用C语言实现中文到unicode码的转换
- 2015新生赛题目
- c语言的心得体会
- c语言心得
- C++命名规则 (转载仅作参考)
- 10个重要的算法C语言实现源代码
- C++实用技巧(二)
- C++实用技巧(一)
- c语言用宏模拟泛型容器
- 项目总结
- c++ --> extern "C" {}详解
- 在C++中获取当前执行文件的路径
- 对嵌入式开发C语言结构体的一点总结
- 对嵌入式开发C语言结构体的一点总结
- 对嵌入式开发C语言结构体的一点总结
- C++多态之继承5-继承和访问说明符(public ,protected, private)
- c语言项目感受