I’m using the libsndfile library for a signal processing project. I’m compiling c code using gcc on a WSL Ubuntu shell. I installed libsndfile-dev using sudo apt-get install libsndfile1-dev
, as well as built the cloned libsndfile repository following its instructions on GitHub. As a test, I’m attempting to run https://github.com/libsndfile/libsndfile/blob/master/examples/make_sine.c outside the repository (it successfully generated the WAV file when ran within) by including the apt-get installed version.
When gcc make_sine.c
is run, it generates the following errors:
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
I believe this is because the library is not properly linked in the gcc command. However, when I attempt to link the library, calling instead gcc make_sine.c -l sndfile
, it generates the following errors:
/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
Q8 of http://www.mega-nerd.com/libsndfile/FAQ.html specifies how to use libsndfile once it’s installed. I’ve run all three commands, however, the final command simply generated the same output as gcc make_sine.c
.
tl;dr: How do I properly compile make_sine.c outside of the libsndfile repository so that it generates a WAV file?
2
Answers
The problem is that you have to link the glibc math libraries in addition to libsdnfile. Running
gcc make_sine.c -lm -lsndfile
produces the correct output (sine.wav) upon execution of a.out. This works regardless of whether you use the apt-get version or runmake install
in a compiled cloned version of the libsndfile github.Seems like your gcc couldn’t find a libsndfile. You could compile with pkgconfig usage or with just a linker only. In both ways you need to be sure that your program could find library. First of all, find a full path to libsndfile using
sudo find / -name "*sndfile*"
.Then this path you just need to add in search path. For pkgconfig use
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/"your path to pkgconfig folder witch contains sndfile.pc"
.For linker just add -L
path to .so file
to yours compiler comand. For example:gcc make_sine.c -L/usr/lib -lsndfile -o your_program
.