我正在尝试使用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位偏移”的选项。我不确定我会怎么做。以下是奈奎斯特的作者推荐我调查的特定文件: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位,但我不认为奈奎斯特支持这种选择。”
以下是奈奎斯特的源代码:http://svn.code.sf.net/p/nyquist/code/trunk/nyquist/
这个问题对我来说很难解决,因为它由一个相对模糊的软件的利基用例组成。这也使问题的支持前景有点令人担忧。我知道一点点C ++,但我对解决这个问题的能力很有信心。感谢所有人的阅读和节日快乐。如果您有任何建议,即使在格式化或编辑方面,请不要犹豫!
如果你看看libsndfile
中捆绑的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
工作类型的标头,用于将要构建的系统。因此,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
的大小,文件接口的其余部分甚至在32位系统上使用64位版本。
这可能会也可能不会起作用,这取决于您的系统是否支持它并且它不是一个干净的解决方案,因为可能会有更多的错误配置libsndfile
被忽视。此标志还可能引入代码所依赖的其他接口更改,从而导致进一步的构建或运行时错误/漏洞。
尽管如此,我认为cmake的语法是添加:
add_compile_definitions(_FILE_OFFSET_BITS=64)
或取决于cmake版本:
add_definitions(-D_FILE_OFFSET_BITS=64)
在适当的CMakeLists.txt
。nyquist/nylsf
解释了如何生成文件。您可以尝试获取它所基于的相同libsndfile
版本的源代码,并重复给出的步骤以生成为您的系统配置的nylsf
。它可能比2.和3引起更少的问题,因为不会引入任何版本/接口更改。