1

我正在尝试使用 Nyquist(一个音乐编程平台,请参阅:https ://www.cs.cmu.edu/~music/nyquist/或https://www.audacityteam.org/about/nyquist/)作为独立程序,它利用 libsndfile(一个用于读写声音的库,参见:http ://www.mega-nerd.com/libsndfile/ )。我在 i686 GNU/Linux 机器 (Gentoo) 上执行此操作。

成功设置并无错误启动程序后,我尝试通过示例之一“(play(osc 60))”生成声音,但遇到此错误:

*** Fatal error : sizeof (off_t) != sizeof (sf_count_t)
*** This means that libsndfile was not configured correctly.

进一步调查(并通过电子邮件发送给作者)证明有些帮助,但解决方案仍然离我很远。作者建议查看 /usr/include/sndfile.h 以了解 sf_count_t 是如何定义的,并且(这部分)我的文件与他的相同:

/* The following typedef is system specific and is defined when libsndfile is
** compiled. sf_count_t will be a 64 bit value when the underlying OS allows
** 64 bit file offsets.
** On windows, we need to allow the same header file to be compiler by both GCC
** and the Microsoft compiler.
*/

#if (defined (_MSCVER) || defined (_MSC_VER))
typedef __int64         sf_count_t ;
#define SF_COUNT_MAX          0x7fffffffffffffffi64
#else
typedef int64_t sf_count_t ;
#define SF_COUNT_MAX            0x7FFFFFFFFFFFFFFFLL
#endif

在上面作者指出,没有“32 位偏移”选项。我不确定我将如何进行。这是 Nyquist 的作者推荐我调查的特定文件:https ://github.com/erikd/libsndfile/blob/master/src/sndfile.h.in ,这是整个源代码树:https://github .com/erikd/libsndfile

以下是作者电子邮件回复中的一些相关片段:

“我猜 sf_count_t 必须显示为 32 位,并且您希望 libsndfile 使用 64 位文件偏移量。我使用 nyquist/nylsf,它是 libsndfile 源的本地副本——让它们保持最新需要更多工作(所以他们可能不是)但是当你有一个一致的库时,构建和测试会容易得多。”

“我使用 CMake 和 nyquist/CMakeLists.txt 来构建 nyquist。”

“可能是那台 32 位的机器,默认 sf_count_t 是 32 位,但我觉得 Nyquist 不支持这个选项。”

这里是奈奎斯特的源代码:http: //svn.code.sf.net/p/nyquist/code/trunk/nyquist/

这个问题对我来说很难解决,因为它是由相对晦涩的软件的一个小众用例组成的。这也使得该问题的支持前景有些令人担忧。我知道一点 C++,但我对自己解决这个问题的能力没有信心。感谢大家的阅读,祝大家节日快乐。如果您有任何建议,即使是在格式或编辑方面,请不要犹豫!

4

1 回答 1

3

如果您查看捆绑libsndfilenyquistie中的来源nylsf,那么您会看到它sndfile.h是直接提供的。它定义sf_count_t为 64 位整数。

然而,libsndfile来源没有这个文件,而是有一个sndfile.h.in. 这是 的输入文件autoconf,它是一个从该模板生成正确头文件的工具。它目前sf_count_t对 linux 系统有以下定义(并且有一段时间了):

typedef @TYPEOF_SF_COUNT_T@ sf_count_t ;

@TYPEOF_SF_COUNT_T@被替换为为将要构建的系统autoconf生成具有工作类型的标头。因此sf_count_t,提供的头文件已经配置好了(大概是为作者的系统配置的)。nyquist

off_t是由 POSIX 标准指定并在系统的 libc 中定义的类型。如果系统是 32 位,它在使用 GNU C 库的系统上的大小是 32 位。

这会导致有问题的健全性检查失败,因为 和 的大小sf_count_toff_t匹配。错误消息也是正确的,因为我们sndfile.h为构建使用了不合适的配置。

在我看来,您有以下选择:

  1. nyquist作者提供未配置的sndfile.h.in并用于autoconf在构建时配置此文件。

  2. 不要使用捆绑libsndfile和链接对系统的一个。(这需要一些知识和工作来更改构建脚本和头文件,可能会出现额外的意外问题)

  3. 如果您使用的是 GNU C 库 (glibc):预处理器宏_FILE_OFFSET_BITS可以设置64为强制off_t文件接口的大小和其余部分使用 64 位版本,即使在 32 位系统上也是如此。

    这可能会或可能不会起作用,具体取决于您的系统是否支持它,并且它不是一个干净的解决方案,因为可能存在其他libsndfile被忽视的错误配置。此标志还可能引入代码所依赖的其他接口更改,从而导致进一步的构建或运行时错误/漏洞。

    尽管如此,我认为 cmake 的语法是添加:

    add_compile_definitions(_FILE_OFFSET_BITS=64)
    

    或取决于 cmake 版本:

    add_definitions(-D_FILE_OFFSET_BITS=64)
    

    在适当的CMakeLists.txt.

  4. 实际上,自述nyquist/nylsf文件解释了它的文件是如何生成的。您可以尝试获取libsndfile它所基于的相同版本的源代码,并重复给出的步骤以生成一个nylsf配置到您的系统。它可能会导致比 2. 和 3. 更少的问题,因为不会引入任何版本/接口更改。

于 2018-12-27T01:01:43.247 回答