【问题标题】:alsa-lib - Can't locate structure definition. A low level design pattern?alsa-lib - 找不到结构定义。低级设计模式?
【发布时间】:2015-10-10 13:13:45
【问题描述】:

this example header file 的第 63 行有一个 typedef:

typedef struct _snd_ctl_elem_info snd_ctl_elem_info_t;

在代码中有多个类似的 typedef 示例。 我的目标是获得结构_snd_ctl_elem_info 的实际定义,但我已经搜索了源代码并用谷歌搜索,但没有发现实际定义的痕迹。由于这次搜索失败,我开始认为我可能遗漏了一些概念,这可能与内核和向后兼容性有关?

我这样做的动机是能够通过 alsa 单步执行 gdb 并对结构有一个概览。

这是某种形式的低级结构定义模式吗?

【问题讨论】:

    标签: c linux alsa


    【解决方案1】:

    听起来好像是从 typedef 重命名的:

    #define _snd_ctl_elem_info sndrv_ctl_elem_info
    

    所以你正在寻找sndrv_ctl_elem_info,它更容易找到。

    asound.h 的第 809 行定义。

    It's pretty massive 所以这里就不贴了。

    【讨论】:

    • 谢谢,仍在试图弄清楚它是如何在 control.h 中可用的,以及为 gdb 添加什么来识别结构。
    【解决方案2】:

    API header snd/asound.h 中定义。这就是客户端代码应该是#include

    【讨论】:

    • 那么内核为什么要导出这个头文件呢?也许客户端代码这个词太宽泛了..
    • 应用程序无法包含您链接的文件。内核标头仅由使用内核的ioctl() API 的代码使用。
    【解决方案3】:

    这个结构也被 alsa-lib 用来与内核通信,所以它只是重用了内核的定义。

    内核头文件将被安装为/usr/include/sound/asound.h,但为了避免依赖于正确安装的内核头文件,alsa-lib 在alsa-lib/include/sound/asound.h 中有自己的这个文件的副本。

    应用程序不应该直接访问该结构的成员,因此 alsa-lib 在其官方头文件中包含asound.h(甚至不安装它;它仅在编译时使用alsa-lib)。

    要获得实际定义,您需要#include <sound/asound.h>

    【讨论】:

      猜你喜欢
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 2022-11-12
      • 2017-07-07
      • 1970-01-01
      • 2011-08-17
      • 2020-04-14
      相关资源
      最近更新 更多