spdk dpdk编译动态库( shared library )

1,dpdk编译共享库

默认情况下都编译出静态库,如果想编译出动态库,把config/common_base文件中的CONFIG_RTE_BUILD_SHARED_LIB改成y即可。

2,spdk编译共享库

修改mk/spdk.common.mk:

# Archive $(OBJS) into [email protected] (.so)

# Archive $(OBJS) into [email protected] (.a)

# LIB_C=\

#       $(Q)echo "  LIB $(notdir [email protected])"; \

#       rm -f [email protected]; \

#       ar crDs [email protected] $(OBJS)

LIB_C=\

gcc -shared -Wl,-soname,$(notdir [email protected]) -o [email protected] $(OBJS); \

ln -s $(notdir [email protected]) [email protected]

// …

# define spdk_lib_list_to_files

#       $(1:%=$(SPDK_ROOT_DIR)/build/lib/libspdk_%.a)

# endef

define spdk_lib_list_to_files

$(1:%=$(SPDK_ROOT_DIR)/build/lib/libspdk_%.so)

endef

// notdir将绝对路径中的路径名去掉,不然编译后的sonar是绝对路径,应用程序使用它的时候无法编译通过。改命令相关的manual见这里:https://www.gnu.org/software/make/manual/html_node/File-Name-Functions.html#File-Name-Functions

修改Makefile,只编译library库,其他example和test等库不要编译:

#DIRS-y += lib test examples app

DIRS-y += lib

如果在编译链接的时候,发现某个函数所在的library分明在library列表中,却依然报错说undefined reference to `rte_eal_device_remove’。需要更改dpdk的导出符号配置文件,将这个符号加入到导出符号列表中。这个文件往往是*.map,如librte_eal/linuxapp/eal/rte_eal_version.map。

导出符号的文档见这里:https://www.gnu.org/software/gnulib/manual/html_node/LD-Version-Scripts.html#LD-Version-Scripts

注:本文所有内容基于spdk16.11和dpdk16.11

时间: 2024-10-18 10:43:35

spdk dpdk编译动态库( shared library )的相关文章

gcc 动态编译 动态库路径

gcc 动态编译(共享库) 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令优点:体积小,编译快缺点:依赖性高 代码如下: [[email protected] shared]# cat add.cint add (int x, int y) {return x + y;} Parsed in 0.007 seconds at 12.13 KB/sadd.c 求和函数 代码如下: [[email protected] shared]# cat print.

Linux环境编译动态库和静态库总结

对Linux环境动态库和静态库的一些基础知识做一些总结, 首先总结静态库的编译步骤. 1 先基于.cpp或者.c文件生成对应的.o文件 2将几个.o文件 使用ar -cr命令 生成libname.a文件 libname.a 为静态库, name 为静态库的名字, 可以根据模块功能命名. 举个例子 在当前目录下,有一个mymethod.h文件 在mymethod.cpp里实现这两个函数 在当前目录下有一个main.cpp文件 为了方便使用,将mymethod.cpp封装成静态库和动态库 首先将my

ndk学习8: 编译动态库

目录: 手工编译动态库 ndk-build编译动态库(Eclipse环境) ? 手工编译静态库 老规矩还是先手工操作,知其然并知其所以然 ? 需要用到的核心命令: gcc -g -c -fpic -Wall mod1.c mod2.c mod3.c gcc -g ?-shared mod1.o mod2.o mod3.o -o libfoo.so gcc -g ?-fpic -Wall -shared mod1.o mod2.o mod3.o -o libfoo.so ? 程序运行会优先从系统目

linux编译动态库时,libcrypto.a 提示recompile with -fPIC

/usr/bin/ld: /usr/local/ssl/lib/libcrypto.a(x86_64cpuid.o): relocation R_X86_64_PC32 against `OPENSSL_cpuid_setup' can not be used when making a shared object; recompile with -fPIC ##g++编译动态库时,使用了ssl的静态库/usr/local/ssl/lib/libcrypto.a,结果一直报上面的错误用opens

Makefile 编译动态库文件及链接动态库

本文为原创文章,转载请指明该文链接 文件目录结构如下 1 dynamiclibapp.c 2 Makefile 3 comm/inc/apue.h 4 comm/errorhandle.c 5 dynamiclib/Makefile 6 dynamiclib/dynamiclib_add.c 7 dynamiclib/dynamiclib_mul.c 8 dynamiclib/inc/dynamiclibs.h 9 dynamiclib/libs/ 1. dynamiclib目录 dynamic

arm平台编译动态库报 relocation R_ARM_MOVW_ABS_NC 错误解决

编译一个能在 arm 平台上用的动态库,结果报错如下: relocation R_ARM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC ./obj/xxx.o: could not read symbols: Bad value collect2: error: ld returned 1 exit status 其实错误信息已经给出解决

Makefile 递归遍历目录(含子目录) 编译动态库

这里推荐一本书,Makefile手册,本人正在学习,多交流~ 一.统一编译所有子目录的文件 直接上Makefile内容了, AR=arLD=ldCC=gcc CFLAGS = -O2 -Wall  -I./Test \                -I./Test/Test1 \ #注:"\"后面不能有空格,并且该句写完后最好有个换行 #注释部分推荐在单独的一行编写 #动态库需要 -fPIC  -shared SOFLAGS = -O2 -fPIC -sharedTARGET = .

linux编译动态库 fPIC作用

在生成动态库时,常常习惯性的加上fPIC选项,fPIC有什么作用和意义,加不加有什么区别,这里做下小结: fPIC的全称是 Position Independent Code, 用于生成位置无关代码.什么是位置无关代码,个人理解是代码无绝对跳转,跳转都为相对跳转. 1.不加fPIC选项 即使不加fPIC也可以生成.so文件,但是对于源文件有要求,例如 因为不加fPIC编译的so必须要在加载到用户程序的地址空间时重定向所有表目,所以在它里面不能引用其它地方的代码 如下: #include <std

spdk/dpdk 编译相关问题汇总

下载 到官网上下载最新的spdk 代码. 解决编译依赖 yum install libaio.x86_64 libaio-devel.x86_64 编译dpdk 特别注意的是dpdk:依赖 /lib/modules/uname -a/build 下执行的内核已经存在,并且编译过,为此需要: 下载内核: 安装依赖:yum install ncurses.x86_64 ncurses-devel.x86_64 ncurses-libs.x86_64 ncurses-static.x86_64 ncu