我正在尝试将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

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



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

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

最佳答案

如果查看libsndfile中 bundle 的nyquist的源(即nylsf),那么您会看到直接提供了sndfile.h。它将sf_count_t定义为64位整数。

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

typedef @TYPEOF_SF_COUNT_T@ sf_count_t ;
@TYPEOF_SF_COUNT_T@将替换为autoconf,以为要为其构建系统的sf_count_t生成具有工作类型的 header 。因此,已经配置了nyquist提供的头文件(可能是针对作者的系统)。
off_t是由POSIX标准指定并在系统的libc中定义的类型。如果系统为32位,则在使用GNU C库的系统上其大小为32位。

这会导致相关的完整性检查失败,因为sf_count_toff_t的大小不匹配。错误消息也是正确的,因为我们在构建中使用了未经适当配置的sndfile.h

在我看来,您有以下选择:
  • 要求nyquist作者提供未配置的sndfile.h.in,并在构建时使用autoconf配置此文件。
  • 不要使用 bundle 的libsndfile并链接到系统的
  • 。 (这需要一些知识和工作来更改构建脚本和头文件,也许还有其他意外问题)
  • 如果使用的是GNU C库(glibc):可以将预处理器宏_FILE_OFFSET_BITS设置为64以强制off_t的大小,并且文件接口(interface)的其余部分即使在32位系统上也使用64位版本。

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

    尽管如此,我认为cmake的语法将添加:
    add_compile_definitions(_FILE_OFFSET_BITS=64)
    

    或取决于cmake版本:
    add_definitions(-D_FILE_OFFSET_BITS=64)
    

    在适当的CMakeLists.txt中。
  • 实际上README in nyquist/nylsf 解释了如何生成该文件的文件。您可以尝试获取与之基于的libsndfile版本相同的源代码,并重复给出的步骤以生成配置到系统的nylsf。与2.和3.相比,它可能引起的问题更少,因为不会引入任何版本/界面更改。
  • 关于c - libsndfile中的sndfile.h中的sf_count_t类型如何定义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53938092/

    10-14 06:14