首页 > 代码库 > spdk dpdk编译动态库( shared library )
spdk dpdk编译动态库( shared library )
1,dpdk编译共享库
默认情况下都编译出静态库,如果想编译出动态库,把config/common_base文件中的CONFIG_RTE_BUILD_SHARED_LIB改成y即可。
2,spdk编译共享库
修改mk/spdk.common.mk:
# Archive $(OBJS) into $@ (.so)
# Archive $(OBJS) into $@ (.a)
# LIB_C=\
# $(Q)echo " LIB $(notdir $@)"; \
# rm -f $@; \
# ar crDs $@ $(OBJS)
LIB_C=\
gcc -shared -Wl,-soname,$(notdir $@.1) -o $@.1 $(OBJS); \
ln -s $(notdir $@.1) $@
// …
# 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
spdk dpdk编译动态库( shared library )