声明:此文档只做学习交流使用,请勿用作其他商业用途
author:朝阳_tony转载请注明出处:http://blog.csdn.net/linzhaolover
此文请结合intel dpdk源码去阅读,源码可以去http://dpdk.org/dev 网页中下载;更多官方文档请访问http://dpdk.org
本文章基于intel dpdk 的源码1.3.1 版本进行讲解;
export RTE_SDK=`pwd` export RTE_TARGET=x86_64-default-linuxapp-gcc
echo CONFIG_RTE_LIBFOO=y >> config/defconfig_x86_64-default-linuxapp-gcc
mkdir ${RTE_SDK}/lib/libfoo touch ${RTE_SDK}/lib/libfoo/foo.c touch ${RTE_SDK}/lib/libfoo/foo.h编辑源码;
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "foo.h" void foo(void) { printf("libfoo test appliation\n"); fprintf(stdout,"%s %d\n",__func__,__LINE__); }
#ifndef _RTE_FOO_H_ #define _RTE_FOO_H_ extern void foo(void); #endif
cp lib/librte_mempool/Makefile lib/libfoo/Makefile修改一下libfoo目录下的Makefile文件,我需要修改几个地方以适应我们自己的源码库;
include $(RTE_SDK)/mk/rte.vars.mk # library name LIB = librte_mempool.a CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 # all source are stored in SRCS-y SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) := rte_mempool.c # install includes SYMLINK-$(CONFIG_RTE_LIBRTE_MEMPOOL)-include := rte_mempool.h # this lib needs eal DEPDIRS-$(CONFIG_RTE_LIBRTE_MEMPOOL) += lib/librte_eal lib/librte_ring include $(RTE_SDK)/mk/rte.lib.mk
# this lib needs eal DEPDIRS-$(CONFIG_RTE_LIBFOO) += lib/librte_eal lib/librte_ring最后libfoo/Makefile是下面这样;
include $(RTE_SDK)/mk/rte.vars.mk # library name LIB = libfoo.a CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 # all source are stored in SRCS-y SRCS-$(CONFIG_RTE_LIBFOO) := foo.c # install includes SYMLINK-$(CONFIG_RTE_LIBFOO)-include := foo.h # this lib needs eal DEPDIRS-$(CONFIG_RTE_LIBFOO) += lib/librte_eal lib/librte_ring include $(RTE_SDK)/mk/rte.lib.mk
DIRS-$(CONFIG_RTE_LIBFOO) += libfoo
ifeq ($(CONFIG_RTE_LIBRTE_MEMPOOL),y) LDLIBS += -lrte_mempool endif #add my test foo option ifeq ($(CONFIG_RTE_LIBFOO),y) LDLIBS += -lfoo endif
rm -r x86_64-default-linuxapp-gcc/ make install T=x86_64-default-linuxapp-gcc如果成功了,会创建libfoo.a 和一个foo.h文件;
ls x86_64-default-linuxapp-gcc/include/会发现多了一个foo.h的文件链接;
ls x86_64-default-linuxapp-gcc/lib/多了一个libfoo.a静态库文件;
mkdir mydpdk touch mydpdk/main.c cp examples/helloworld/Makefile mydpdk/Makefilemain.c源码;
#include <stdio.h> #include <string.h> #include <stdint.h> #include <errno.h> #include <sys/queue.h> #include <rte_memory.h> #include <rte_memzone.h> #include <rte_launch.h> #include <rte_tailq.h> #include <rte_eal.h> #include <rte_per_lcore.h> #include <rte_lcore.h> #include <rte_debug.h> #include <foo.h> int main(int argc, char **argv) { foo(); return 0; }foo.h 就是我在第一节创建的foo库的头文件;
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-default-linuxapp-gcc include $(RTE_SDK)/mk/rte.vars.mk # binary name APP = mydpdk # all source are stored in SRCS-y SRCS-y := main.c #CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) include $(RTE_SDK)/mk/rte.extapp.mk这要注意,将APP的输出名写成自己需要的,我这写的谁mydpdk,也就是将来了可执行程序名字;
make -C mydpdk/
# ./mydpdk/build/mydpdk libfoo test appliation foo 10打印了一些信息,就是我在foo库中要输出的信息;