我正在尝试将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_t
和off_t
的大小不匹配。错误消息也是正确的,因为我们在构建中使用了未经适当配置的sndfile.h
。在我看来,您有以下选择:
nyquist
作者提供未配置的sndfile.h.in
,并在构建时使用autoconf
配置此文件。 libsndfile
并链接到系统的_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
中。 nyquist/nylsf
解释了如何生成该文件的文件。您可以尝试获取与之基于的libsndfile
版本相同的源代码,并重复给出的步骤以生成配置到系统的nylsf
。与2.和3.相比,它可能引起的问题更少,因为不会引入任何版本/界面更改。 关于c - libsndfile中的sndfile.h中的sf_count_t类型如何定义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53938092/