Как тип sf_count_t в sndfile.h определен в libsndfile? - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь работать с 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 поддерживает эту опцию. "

А вот исходный код Nyquist: http://svn.code.sf.net/p/nyquist/code/trunk/nyquist/

Эту проблему мне трудно решить, поскольку она состоит из нишевого варианта использования:относительно неясное программное обеспечение. Это также делает перспективы поддержки для этой проблемы немного тревожными. Я немного знаю C ++, но я далек от уверенности в том, что смогу решить эту проблему. Спасибо за чтение и счастливых праздников всем. Если у вас есть какие-либо предложенияПожалуйста, не стесняйтесь, даже с точки зрения форматирования или редактирования!

1 Ответ

0 голосов
/ 27 декабря 2018

Если вы посмотрите на источники для связанного libsndfile в nyquist, то есть 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.Его размер в системе, использующей библиотеку GNU C, составляет 32 бита, если система 32-битная.

Это приводит к сбою проверки правильности, поскольку размеры sf_count_t и off_t не совпадают.Сообщение об ошибке также является правильным, поскольку мы используем неправильно настроенный sndfile.h для сборки.

Как я вижу, у вас есть следующие опции:

  1. Askавтор 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. На самом деле README в nyquist/nylsf объясняет, какфайлы для этого были сгенерированы.Вы можете попытаться получить исходный код той же версии libsndfile, на которой он основан, и повторить шаги, приведенные для создания nylsf, настроенного для вашей системы.Это может вызвать меньше проблем, чем 2. и 3., потому что не будет никаких изменений в версии / интерфейсе.

...