Как правильно связать 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?

🤔 А знаете ли вы, что...
C используется для создания библиотек и фреймворков, которые расширяют его функциональность.


50
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.


Решено

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