Я использую библиотеку 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?
Похоже, ваш 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
.
прежде всего. PKG_CONFIG_PATH не должен содержать путь с именем пакета (содержащий только каталог). О glibc: если вы получите его с помощью apt-get, все будет в порядке. Если вы скомпилировали его самостоятельно, возможно, разница между связанным glibc и вашим слишком велика. И попробуйте добавить путь к libm.so*, используя конструкцию -L/"path" -lm. Возможно, это должно помочь. Я лично скомпилировал glibc и libsndfile с помощью своего собственного компилятора gcc из исходного кода, и все работает отлично.
Моя конкретная проблема заключалась в том, что я не связывал математические библиотеки glibc при компиляции make_sine.c (который импортирует math.h), а не в самом libsndfile. В любом случае, спасибо за вашу помощь.
Проблема в том, что вам нужно связать математические библиотеки glibc в дополнение к libsdnfile. Запуск gcc make_sine.c -lm -lsndfile
дает правильный результат (sine.wav) после выполнения a.out. Это работает независимо от того, используете ли вы версию apt-get или запускаете make install
в скомпилированной клонированной версии libsndfile github.
После запуска
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/"/usr/lib/x86_64-linux-gnu/pkgconfig/sndfile.pc"
запускgcc make_sine.c -L/usr/lib -lsndfile -o your_program
дает тот же результат, что иgcc make_sine.c -l sndfile
. Возможно ли, что версия libsndfile apt-get была скомпилирована с другой версией glibc, чем на моей машине? Если да, то как мне это исправить?