如何在libsndfile中定义sndfile.h中的sf_count_t类型?

问题描述 投票:2回答: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位偏移”的选项。我不确定我会怎么做。以下是奈奎斯特的作者推荐我调查的特定文件: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 ++,但我对解决这个问题的能力很有信心。感谢所有人的阅读和节日快乐。如果您有任何建议,即使在格式化或编辑方面,请不要犹豫!

c linux gnu libsndfile nyquist
1个回答
3
投票

如果你看看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_toff_t的大小不匹配。错误消息也是正确的,因为我们使用不合适的sndfile.h进行构建。

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

  1. nyquist作者提供未配置的sndfile.h.in并使用autoconf在构建时配置此文件。
  2. 不要使用捆绑的libsndfile并链接到系统的。 (这需要一些知识和工作来更改构建脚本和头文件,可能还有其他意外问题)
  3. 如果您正在使用GNU C库(glibc):预处理器宏_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
  4. 实际上,README in nyquist/nylsf解释了如何生成文件。您可以尝试获取它所基于的相同libsndfile版本的源代码,并重复给出的步骤以生成为您的系统配置的nylsf。它可能比2.和3引起更少的问题,因为不会引入任何版本/接口更改。
热门问题
推荐问题
最新问题