Как правильно связать libsndfile при компиляции автономного файла с помощью gcc

Я использую библиотеку libsndfile для проекта обработки сигналов. Я компилирую код c с помощью gcc в оболочке WSL Ubuntu. Я установил libsndfile-dev с помощью sudo apt-get install libsndfile1-dev, а также собрал клонированный репозиторий libsndfile, следуя инструкциям на GitHub. В качестве теста я пытаюсь запустить https://github.com/libsndfile/libsndfile/blob/master/examples/make_sine.c вне репозитория (он успешно сгенерировал файл WAV при запуске внутри), включив установленная версия apt-get.

При запуске gcc make_sine.c возникают следующие ошибки:

make_sine.c:(.text+0x8d): undefined reference to `sf_open'
/usr/bin/ld: make_sine.c:(.text+0xed): undefined reference to `sin'
/usr/bin/ld: make_sine.c:(.text+0x15f): undefined reference to `sin'
/usr/bin/ld: make_sine.c:(.text+0x1a9): undefined reference to `sin'
/usr/bin/ld: make_sine.c:(.text+0x200): undefined reference to `sf_close'
/usr/bin/ld: make_sine.c:(.text+0x232): undefined reference to `sf_write_int'
/usr/bin/ld: make_sine.c:(.text+0x24f): undefined reference to `sf_strerror'
/usr/bin/ld: make_sine.c:(.text+0x263): undefined reference to `sf_close'
collect2: error: ld returned 1 exit status

Я считаю, что это связано с тем, что библиотека неправильно связана с командой gcc. Однако когда я пытаюсь связать библиотеку, вызывая вместо этого gcc make_sine.c -l sndfile, она генерирует следующие ошибки:

/usr/bin/ld: /tmp/ccpubl3O.o: undefined reference to symbol 'sin@@GLIBC_2.2.5'
/usr/bin/ld: /lib/x86_64-linux-gnu/libm.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

Вопрос 8 из http://www.mega-nerd.com/libsndfile/FAQ.html определяет, как использовать libsndfile после его установки. Я запустил все три команды, однако последняя команда просто сгенерировала тот же вывод, что и gcc make_sine.c.

tl;dr: Как мне правильно скомпилировать make_sine.c вне репозитория libsndfile, чтобы он генерировал файл WAV?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Похоже, ваш gcc не смог найти файл libsnd. Вы можете скомпилировать с использованием pkgconfig или только с помощью компоновщика. В обоих случаях вам нужно быть уверенным, что ваша программа сможет найти библиотеку. Прежде всего, найдите полный путь к libsndfile, используя sudo find / -name "*sndfile*". Тогда этот путь вам просто нужно добавить в путь поиска. Для pkgconfig используйте export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/"your path to pkgconfig folder witch contains sndfile.pc". Для компоновщика просто добавьте -Lpath to .so file в команду компилятора. Например: gcc make_sine.c -L/usr/lib -lsndfile -o your_program.

После запуска export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/"/usr/lib/x86_64-linux-gnu‌​/pkgconfig/sndfile.p‌​c" запуск gcc make_sine.c -L/usr/lib -lsndfile -o your_program дает тот же результат, что и gcc make_sine.c -l sndfile. Возможно ли, что версия libsndfile apt-get была скомпилирована с другой версией glibc, чем на моей машине? Если да, то как мне это исправить?

James T. Kirk 02.07.2024 17:17

прежде всего. PKG_CONFIG_PATH не должен содержать путь с именем пакета (содержащий только каталог). О glibc: если вы получите его с помощью apt-get, все будет в порядке. Если вы скомпилировали его самостоятельно, возможно, разница между связанным glibc и вашим слишком велика. И попробуйте добавить путь к libm.so*, используя конструкцию -L/"path" -lm. Возможно, это должно помочь. Я лично скомпилировал glibc и libsndfile с помощью своего собственного компилятора gcc из исходного кода, и все работает отлично.

Alexandr Gritsenko 03.07.2024 08:31

Моя конкретная проблема заключалась в том, что я не связывал математические библиотеки glibc при компиляции make_sine.c (который импортирует math.h), а не в самом libsndfile. В любом случае, спасибо за вашу помощь.

James T. Kirk 04.07.2024 00:42
Ответ принят как подходящий

Проблема в том, что вам нужно связать математические библиотеки glibc в дополнение к libsdnfile. Запуск gcc make_sine.c -lm -lsndfile дает правильный результат (sine.wav) после выполнения a.out. Это работает независимо от того, используете ли вы версию apt-get или запускаете make install в скомпилированной клонированной версии libsndfile github.

Другие вопросы по теме