【问题标题】:ssize_t undefined in a dpdk headerssize_t 在 dpdk 标头中未定义
【发布时间】:2021-07-27 01:08:42
【问题描述】:

我安装了 DPDK,我正在尝试用它编译代码。这在我的 WSL 机器上有效,但是在测试服务器上,使用相同的 dpdk 安装,我收到错误:

/usr/local/include/rte_mempool.h: error: unknown type name 'ssize_t'

我注意到这个头文件不包括 /sys/types.h,但它也不包括在它工作的机器上。我不知道它应该来自哪里,但它来自某个地方。

如何让这些标头了解 ssize_t?


comment 中所述:

编译器选项包括-std=c99 -O3 -march=native -I/usr/local/include -include rte_config.h,以及一大堆-l 选项(dpdk 的 make 结构添加了这些选项)。这促使我运行gcc --version,工作的是Ubuntu gcc 9.3.0,损坏的是gcc 5.4.0。看起来可能是dpdk和安装的gcc不兼容。

【问题讨论】:

  • ssize_tsys/types.h 中定义,通常由#include <unistd.h> 自动引入
  • 你使用什么编译选项(包使用)?您可能需要通过适当的#define(例如命令行选项中的#define _XOPEN_SOURCE 700-D_XOPEN_SOURCE=700)主动请求POSIX 数据类型,例如ssize_t
  • @JonathanLeffler -std=c99 -O3 -march=native -I/usr/local/include -include rte_config.h,以及一大堆 -l 选项(dpdk 的 make 结构添加了这些)。这促使我运行gcc --version,工作的是 ubuntu gcc 9.3.0,坏的是 gcc 5.4.0。好像是dpdk和安装的gcc不兼容
  • -std=c99 选项会抑制 POSIX 功能,除非您添加 -D_XOPEN_SOURCE=700 或等效项 - 这解释了您现在遇到问题的原因(但不能解释为什么它在其他地方工作)。使用-std=gnu99 获取定义,无需指定_XOPEN_SOURCE
  • 另见GCC with -std=c99 complains about not knowing struct timespec。这个问题实际上是那个问题的副本——类型名称不同,但问题的原因是相同的。如果您将编译器选项放入问题中会很有帮助,以便稍后出现的人更清楚导致问题的原因。

标签: c types dpdk


【解决方案1】:

正如@JonathanLeffier 在 cmets 中提到的,问题的根本原因是在传递 gcc 选项 --std=c99 时包含 sys/types.h。在不修改 DPDK 或示例代码的情况下,最简单的解决方法是types.h 的路径包含在 cflags 中

如果本机构建适用于 x86_64 目标,请按照以下步骤操作:

  1. 执行find /usr/include/ -name types.h 为本地构建识别正确的文件(这是因为当前的cflags 有-march=native)
  2. 将 CFLAGS 从 -std=c99 -O3 -march=native -I/usr/local/include -include rte_config.h 修改为 -std=c99 -O3 -march=native -I/usr/local/include -include rte_config.h --include=/usr/include/[target-machine]/sys/types.h

注意:在我的谦虚建议中,请使用 pkg-config 为共享和静态二进制文件填充正确的 CFLAGS 和 LDFLAGS。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-06
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 2011-06-05
    • 2018-04-12
    相关资源
    最近更新 更多