c - 在 Ubuntu 16.04 上构建 DPDK 17.02 和 16.11 时出错

标签 c ubuntu virtualbox ubuntu-16.04 dpdk

我正在尝试在 Ubuntu 16.04 64 位上构建 DPDK 16.11.1 和 17.02.1,内核版本为 4.13.0,在 Windows 7 主机上作为 VirtualBox guest 运行:

wwa@ssa:~/dpdk-stable-16.11.1$ uname -a
Linux osboxes 4.13.0-32-generic #35~16.04.1-Ubuntu SMP Thu Jan 25 10:13:43 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

DPDK 配置为 x86_64-native-linuxapp-gcc:

wwa@ssa:~/dpdk-stable-16.11.1$ make config T=x86_64-native-linuxapp-gcc CC=gcc
Configuration done

在构建 DPDK 时,我收到以下编译错误:错误:函数“pci_enable_msix”的隐式声明。这是完整的输出:

wwa@ssa:~/dpdk-stable-16.11.1$ make CC=gcc
== Build lib
== Build lib/librte_compat
  SYMLINK-FILE include/rte_compat.h
== Build lib/librte_eal
== Build lib/librte_eal/common
  SYMLINK-FILE include/generic/rte_atomic.h
  SYMLINK-FILE include/generic/rte_byteorder.h
  SYMLINK-FILE include/generic/rte_cycles.h
  SYMLINK-FILE include/generic/rte_prefetch.h
  SYMLINK-FILE include/generic/rte_spinlock.h
  SYMLINK-FILE include/generic/rte_memcpy.h
  SYMLINK-FILE include/generic/rte_cpuflags.h
  SYMLINK-FILE include/generic/rte_rwlock.h
  SYMLINK-FILE include/rte_branch_prediction.h
  SYMLINK-FILE include/rte_common.h
  SYMLINK-FILE include/rte_debug.h
  SYMLINK-FILE include/rte_eal.h
  SYMLINK-FILE include/rte_errno.h
  SYMLINK-FILE include/rte_launch.h
  SYMLINK-FILE include/rte_lcore.h
  SYMLINK-FILE include/rte_log.h
  SYMLINK-FILE include/rte_memory.h
  SYMLINK-FILE include/rte_memzone.h
  SYMLINK-FILE include/rte_pci.h
  SYMLINK-FILE include/rte_per_lcore.h
  SYMLINK-FILE include/rte_random.h
  SYMLINK-FILE include/rte_tailq.h
  SYMLINK-FILE include/rte_interrupts.h
  SYMLINK-FILE include/rte_alarm.h
  SYMLINK-FILE include/rte_string_fns.h
  SYMLINK-FILE include/rte_version.h
  SYMLINK-FILE include/rte_eal_memconfig.h
  SYMLINK-FILE include/rte_malloc_heap.h
  SYMLINK-FILE include/rte_hexdump.h
  SYMLINK-FILE include/rte_devargs.h
  SYMLINK-FILE include/rte_dev.h
  SYMLINK-FILE include/rte_vdev.h
  SYMLINK-FILE include/rte_pci_dev_feature_defs.h
  SYMLINK-FILE include/rte_pci_dev_features.h
  SYMLINK-FILE include/rte_malloc.h
  SYMLINK-FILE include/rte_keepalive.h
  SYMLINK-FILE include/rte_time.h
  SYMLINK-FILE include/rte_rwlock.h
  SYMLINK-FILE include/rte_memcpy.h
  SYMLINK-FILE include/rte_cycles.h
  SYMLINK-FILE include/rte_spinlock.h
  SYMLINK-FILE include/rte_atomic_32.h
  SYMLINK-FILE include/rte_vect.h
  SYMLINK-FILE include/rte_prefetch.h
  SYMLINK-FILE include/rte_byteorder_32.h
  SYMLINK-FILE include/rte_atomic_64.h
  SYMLINK-FILE include/rte_rtm.h
  SYMLINK-FILE include/rte_cpuflags.h
  SYMLINK-FILE include/rte_byteorder_64.h
  SYMLINK-FILE include/rte_atomic.h
  SYMLINK-FILE include/rte_byteorder.h
== Build lib/librte_eal/linuxapp
== Build lib/librte_eal/linuxapp/eal
  CC eal.o
  CC eal_hugepage_info.o
  CC eal_memory.o
  CC eal_thread.o
  CC eal_log.o
  CC eal_vfio.o
  CC eal_vfio_mp_sync.o
  CC eal_pci.o
  CC eal_pci_uio.o
  CC eal_pci_vfio.o
  CC eal_debug.o
  CC eal_lcore.o
  CC eal_timer.o
  CC eal_interrupts.o
  CC eal_alarm.o
  CC eal_common_lcore.o
  CC eal_common_timer.o
  CC eal_common_memzone.o
  CC eal_common_log.o
  CC eal_common_launch.o
  CC eal_common_vdev.o
  CC eal_common_pci.o
  CC eal_common_pci_uio.o
  CC eal_common_memory.o
  CC eal_common_tailqs.o
  CC eal_common_errno.o
  CC eal_common_cpuflags.o
  CC eal_common_string_fns.o
  CC eal_common_hexdump.o
  CC eal_common_devargs.o
  CC eal_common_dev.o
  CC eal_common_options.o
  CC eal_common_thread.o
  CC eal_common_proc.o
  CC rte_malloc.o
  CC malloc_elem.o
  CC malloc_heap.o
  CC rte_keepalive.o
  CC rte_cpuflags.o
  CC rte_spinlock.o
  AR librte_eal.a
  SYMLINK-FILE include/exec-env/rte_interrupts.h
  SYMLINK-FILE include/exec-env/rte_kni_common.h
  SYMLINK-FILE include/exec-env/rte_dom0_common.h
  INSTALL-LIB librte_eal.a
== Build lib/librte_eal/linuxapp/igb_uio
  AR      /home/osboxes/dpdk-stable-16.11.1/build/build/lib/librte_eal/linuxapp/igb_uio/built-in.o
  CC [M]  /home/osboxes/dpdk-stable-16.11.1/build/build/lib/librte_eal/linuxapp/igb_uio/igb_uio.o
/home/osboxes/dpdk-stable-16.11.1/build/build/lib/librte_eal/linuxapp/igb_uio/igb_uio.c: In function ‘igbuio_pci_probe’:
/home/osboxes/dpdk-stable-16.11.1/build/build/lib/librte_eal/linuxapp/igb_uio/igb_uio.c:383:7: error: implicit declaration of function ‘pci_enable_msix’ [-Werror=implicit-function-declaration]
   if (pci_enable_msix(dev, &msix_entry, 1) == 0) {
       ^
cc1: all warnings being treated as errors
/usr/src/linux-headers-4.13.0-32-generic/scripts/Makefile.build:315: recipe for target '/home/osboxes/dpdk-stable-16.11.1/build/build/lib/librte_eal/linuxapp/igb_uio/igb_uio.o' failed
make[8]: *** [/home/osboxes/dpdk-stable-16.11.1/build/build/lib/librte_eal/linuxapp/igb_uio/igb_uio.o] Error 1
/usr/src/linux-headers-4.13.0-32-generic/Makefile:1550: recipe for target '_module_/home/osboxes/dpdk-stable-16.11.1/build/build/lib/librte_eal/linuxapp/igb_uio' failed
make[7]: *** [_module_/home/osboxes/dpdk-stable-16.11.1/build/build/lib/librte_eal/linuxapp/igb_uio] Error 2
Makefile:145: recipe for target 'sub-make' failed
make[6]: *** [sub-make] Error 2
/home/osboxes/dpdk-stable-16.11.1/mk/rte.module.mk:79: recipe for target 'igb_uio.ko' failed
make[5]: *** [igb_uio.ko] Error 2
/home/osboxes/dpdk-stable-16.11.1/mk/rte.subdir.mk:61: recipe for target 'igb_uio' failed
make[4]: *** [igb_uio] Error 2
/home/osboxes/dpdk-stable-16.11.1/mk/rte.subdir.mk:61: recipe for target 'linuxapp' failed
make[3]: *** [linuxapp] Error 2
/home/osboxes/dpdk-stable-16.11.1/mk/rte.subdir.mk:61: recipe for target 'librte_eal' failed
make[2]: *** [librte_eal] Error 2
/home/osboxes/dpdk-stable-16.11.1/mk/rte.sdkbuild.mk:78: recipe for target 'lib' failed
make[1]: *** [lib] Error 2
/home/osboxes/dpdk-stable-16.11.1/mk/rte.sdkroot.mk:126: recipe for target 'all' failed
make: *** [all] Error 2

有人知道为什么会这样吗? 我在 16.11.1 和 17.02.1 上都有相同的错误

最佳答案

我看到已经有一个 fix在 DPDK 的新版本中。我想你有几个选择:

  • 申请the patch在您本地的 DPDK 代码上
  • 使用较新的 DPDK 版本
  • 使用 4.8 之前版本的 Linux 内核

编辑:应用补丁对于 DPDK 16.11 来说是不够的。

如果无法更改 DPDK 版本或迁移到较旧的内核,那么您还可以更改以下代码以以类似的方式调用 pci_enable_msix_range 而不是 pci_enable_msix正如 dpdk patch 所做的那样:

lib/librte_eal/linuxapp/igb_uio/igb_uio.c:

igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
{
    struct rte_uio_pci_dev *udev;
    struct msix_entry msix_entry;
    int err;

    [...]

    switch (igbuio_intr_mode_preferred) {
    case RTE_INTR_MODE_MSIX:
        /* Only 1 msi-x vector needed */
        msix_entry.entry = 0;
        if (pci_enable_msix(dev, &msix_entry, 1) == 0) {
            dev_dbg(&dev->dev, "using MSI-X");
            udev->info.irq = msix_entry.vector;
            udev->mode = RTE_INTR_MODE_MSIX;
            break;
        }
        /* fall back to INTX */
    [...]

关于c - 在 Ubuntu 16.04 上构建 DPDK 17.02 和 16.11 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49105737/

相关文章:

proxy - Apt-Get 无法在带有代理设置的 VirtualBox 中的 Win 7 上的企业防火墙后面工作

C 程序代码将整数拆分为单独行上的数字,仅循环而不使用数组

c - 为什么 "switch-case"将 #define 标识符视为常量而不是 const 限定变量?

C定义字符串为char

php - 在 ubuntu 上为 php7.1 安装 imap

ruby - 使用 shell 配置更新 Vagrant 中的路径

c - android NDK构建错误

c - 交叉编译C代码时出错--未知类型名称 '__syscall_slong_t'

ubuntu - 如何为玩具 MPI 集群配置静态 IP?

linux - 我无法执行命令 modprobe vboxdrv