Aha - the package is somehow failing to install libgroove.so as a symlink to libgroove.so.2.
I double checked debian/libgroove2.install and found the culprit: usr/lib/lib*.so.* I am now changing this to usr/lib/lib*.so* which should do the trick. Thanks for the help Frank - I really appreciate it. Sorry for being so slow to understand. On Tue, Nov 19, 2013 at 9:39 PM, Andrew Kelley <superjo...@gmail.com> wrote: > My mistake for speaking so soon. I tried deleting /usr/lib/libgroove.a and > tried to link again, and I get: > > andy@andy-bx:~/tmp$ c99 -o test test.c -lgroove > /usr/bin/ld: cannot find -lgroove > collect2: error: ld returned 1 exit status > > > This surprised me, because I have the .so in my system: > > andy@andy-bx:~$ ls -alh /usr/lib | grep groove > lrwxrwxrwx 1 root root 18 Nov 19 10:18 libgroove.so.2 -> > libgroove.so.2.0.2 > -rw-r--r-- 1 root root 8.7M Nov 19 10:18 libgroove.so.2.0.2 > andy@andy-bx:~$ objdump -p /usr/lib/libgroove.so.2.0.2 | grep SONAME > SONAME libgroove.so.2 > > I'm at a loss as to how ld is unable to find that file. > > > On Tue, Nov 19, 2013 at 9:04 PM, Andrew Kelley <superjo...@gmail.com>wrote: > >> >> >> >> On Tue, Nov 19, 2013 at 8:57 PM, Frank Trampe <frank.tra...@gmail.com>wrote: >> >>> >>> >>> >>> On Tue, Nov 19, 2013 at 7:31 PM, Andrew Kelley <superjo...@gmail.com>wrote: >>> >>>> >>>> On Tue, Nov 19, 2013 at 7:34 PM, Frank Trampe >>>> <frank.tra...@gmail.com>wrote: >>>> >>>>> As you're running it, gcc is trying to link statically (against >>>>> libgroove.a), so the contents of libgroove.so don't mean much. Are you >>>>> trying to link dynamically? >>>>> >>>> >>>> Yes I am trying to link dynamically. I'm confused - I thought using -l >>>> was dynamic linking and specifying -static and supplying .a files does >>>> static linking. >>>> >>> >>> Most gcc installations on Linux try to link dynamically first if the >>> shared libraries are available and in the search path (I think) but will >>> fall back to static otherwise. Are you sure that the relevant so files are >>> in the search paths? Perhaps you could add the path manually via -L or >>> LIBRARY_PATH and see if that bypasses the problem. >>> >> >> Yes I am sure that the relevant .so files are in the search paths. >> libgroove.so should be the only necessary file. Observe: >> >> $ c99 -o test test.c >> /tmp/ccdS8adV.o: In function `main': >> test.c:(.text+0x41): undefined reference to `groove_init' >> test.c:(.text+0x46): undefined reference to `groove_finish' >> test.c:(.text+0x55): undefined reference to `groove_set_logging' >> test.c:(.text+0x5a): undefined reference to `groove_playlist_create' >> test.c:(.text+0x92): undefined reference to `groove_player_create' >> test.c:(.text+0xa9): undefined reference to `groove_player_attach' >> test.c:(.text+0xd9): undefined reference to `groove_file_open' >> (snip) >> >> >> $ c99 -o test test.c -lgroove >> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgroove.a(file.c.o): >> In function `cleanup_save': >> (.text+0x29): undefined reference to `av_free_packet' >> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgroove.a(file.c.o): >> In function `cleanup_save': >> (.text+0x39): undefined reference to `avio_closep' >> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgroove.a(file.c.o): >> In function `cleanup_save': >> (.text+0x54): undefined reference to `avformat_free_context' >> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgroove.a(file.c.o): >> In function `cleanup_save': >> (.text+0xa1): undefined reference to `av_log' >> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgroove.a(file.c.o): >> In function `groove_file_close': >> (.text+0xe6): undefined reference to `av_free_packet' >> (snip) >> >> The libav and SDL2 dependencies are internal to libgroove and should be >> completely hidden from the end-user of libgroove. >> >> >>> Either way, you will probably want to adjust the dependencies for the >>> package with the static library such that it pulls in the static libraries >>> for libsdl and libav at installation. >>> >> >> I agree that this is desirable. I searched for how to do this and the >> advice that I got was to not do it. Would you be willing to go more into >> detail about how to pull in static dependencies so that users who want to >> link statically against my library will not have to also link statically >> against my dependencies? >> >> >>> >>> >>>> Furthermore, when I link the exact same test.c file with the same gcc >>>> args against a libgroove installation that was built from source rather >>>> than from the PPA, it successfully links and runs. What could explain this >>>> behavior? >>>> >>>> >>> Is this on the same machine? >>> >> >> Yes. You can try it for yourself if you want: >> https://github.com/superjoe30/libgroove/archive/2.0.2.tar.gz >> >> >>> >>> >>>> >>>>> Running nm -g on your static library shows that it includes undefined >>>>> static symbols for the functions that you list. If you link against those >>>>> libraries (libav and libsdl) when building test.c, this ought to work. >>>>> >>>>> >>>>> >>>>> On Tue, Nov 19, 2013 at 11:21 AM, Andrew Kelley >>>>> <superjo...@gmail.com>wrote: >>>>> >>>>>> Hello - >>>>>> >>>>>> I just added a library to my ppa: >>>>>> https://launchpad.net/~andrewrk/+archive/libgroove >>>>>> so far so good, it installs on my system. But when I compile a >>>>>> program against it, I get linker errors - undefined symbols from >>>>>> libraries >>>>>> that my library depends on. This does not happen when I manually build >>>>>> from >>>>>> source. >>>>>> >>>>>> Any suggestions? >>>>>> >>>>>> Here are some more details. >>>>>> >>>>>> The problem: >>>>>> >>>>>> andy@andy-bx:~/tmp$ c99 -o test test.c -lgroove >>>>>> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgroove.a(file.c.o): >>>>>> In function `cleanup_save': >>>>>> >>>>>> (.text+0x29): undefined reference to `av_free_packet' >>>>>> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgroove.a(file.c.o): >>>>>> In function `cleanup_save': >>>>>> >>>>>> (.text+0x39): undefined reference to `avio_closep' >>>>>> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgroove.a(file.c.o): >>>>>> In function `cleanup_save': >>>>>> >>>>>> (.text+0x54): undefined reference to `avformat_free_context' >>>>>> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgroove.a(file.c.o): >>>>>> In function `cleanup_save': >>>>>> >>>>>> (.text+0xa1): undefined reference to `av_log' >>>>>> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgroove.a(file.c.o): >>>>>> In function `groove_file_close': >>>>>> >>>>>> (.text+0xe6): undefined reference to `av_free_packet' >>>>>> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgroove.a(file.c.o): >>>>>> In function `groove_file_close': >>>>>> >>>>>> (.text+0x105): undefined reference to `avcodec_close' >>>>>> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgroove.a(file.c.o): >>>>>> In function `groove_file_close': >>>>>> >>>>>> (.text+0x12b): undefined reference to `avformat_close_input' >>>>>> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgroove.a(file.c.o): >>>>>> In function `groove_file_close': >>>>>> >>>>>> (.text+0x139): undefined reference to `SDL_DestroyMutex' >>>>>> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgroove.a(file.c.o): >>>>>> In function `groove_file_open': >>>>>> >>>>>> (.text+0x16f): undefined reference to `av_mallocz' >>>>>> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgroove.a(file.c.o): >>>>>> In function `groove_file_open': >>>>>> >>>>>> (.text+0x18f): undefined reference to `SDL_CreateMutex' >>>>>> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgroove.a(file.c.o): >>>>>> In function `groove_file_open': >>>>>> >>>>>> (.text+0x1a1): undefined reference to `avformat_alloc_context' >>>>>> ...(snip)... >>>>>> >>>>>> >>>>>> libav is a static dependency of libgroove, and SDL2 is a dynamic >>>>>> dependency. >>>>>> test.c uses only libgroove, it does not depend on libav or SDL2. >>>>>> >>>>>> >>>>>> andy@andy-bx:~$ ldd /usr/lib/libgroove.so.2.0.2 >>>>>> linux-vdso.so.1 => (0x00007fff499c9000) >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 >>>>>> (0x00007fc04ecde000) >>>>>> >>>>>> libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fc04eac5000) >>>>>> libmp3lame.so.0 => /usr/lib/x86_64-linux-gnu/libmp3lame.so.0 >>>>>> (0x00007fc04e837000) >>>>>> >>>>>> libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 >>>>>> (0x00007fc04e61a000) >>>>>> libSDL2-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0 >>>>>> (0x00007fc04e346000) >>>>>> >>>>>> libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc04df7d000) >>>>>> libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc04dc79000) >>>>>> >>>>>> >>>>>> /lib64/ld-linux-x86-64.so.2 (0x00007fc04ff2a000) >>>>>> libasound.so.2 => /usr/lib/x86_64-linux-gnu/libasound.so.2 >>>>>> (0x00007fc04d989000) >>>>>> libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc04d784000) >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> libpulse-simple.so.0 => /usr/lib/x86_64-linux-gnu/libpulse-simple.so.0 >>>>>> (0x00007fc04d580000) >>>>>> libpulse.so.0 => /usr/lib/x86_64-linux-gnu/libpulse.so.0 >>>>>> (0x00007fc04d337000) >>>>>> >>>>>> libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 >>>>>> (0x00007fc04d001000) >>>>>> libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 >>>>>> (0x00007fc04cdef000) >>>>>> >>>>>> libXcursor.so.1 => /usr/lib/x86_64-linux-gnu/libXcursor.so.1 >>>>>> (0x00007fc04cbe5000) >>>>>> libXinerama.so.1 => /usr/lib/x86_64-linux-gnu/libXinerama.so.1 >>>>>> (0x00007fc04c9e1000) >>>>>> >>>>>> libXi.so.6 => /usr/lib/x86_64-linux-gnu/libXi.so.6 (0x00007fc04c7d1000) >>>>>> libXrandr.so.2 => /usr/lib/x86_64-linux-gnu/libXrandr.so.2 >>>>>> (0x00007fc04c5c7000) >>>>>> >>>>>> libXss.so.1 => /usr/lib/x86_64-linux-gnu/libXss.so.1 >>>>>> (0x00007fc04c3c2000) >>>>>> libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 >>>>>> (0x00007fc04c1bc000) >>>>>> >>>>>> librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fc04bfb4000) >>>>>> libpulsecommon-4.0.so => >>>>>> /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-4.0.so >>>>>> (0x00007fc04bd4c000) >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> libjson-c.so.2 => /lib/x86_64-linux-gnu/libjson-c.so.2 >>>>>> (0x00007fc04bb42000) >>>>>> libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 >>>>>> (0x00007fc04b8fc000) >>>>>> >>>>>> libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 >>>>>> (0x00007fc04b6de000) >>>>>> libXrender.so.1 => /usr/lib/x86_64-linux-gnu/libXrender.so.1 >>>>>> (0x00007fc04b4d4000) >>>>>> >>>>>> libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 >>>>>> (0x00007fc04b2cd000) >>>>>> libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007fc04b0c3000) >>>>>> >>>>>> libsndfile.so.1 => /usr/lib/x86_64-linux-gnu/libsndfile.so.1 >>>>>> (0x00007fc04ae5a000) >>>>>> libasyncns.so.0 => /usr/lib/x86_64-linux-gnu/libasyncns.so.0 >>>>>> (0x00007fc04ac54000) >>>>>> >>>>>> libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 >>>>>> (0x00007fc04aa50000) >>>>>> libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 >>>>>> (0x00007fc04a849000) >>>>>> >>>>>> libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007fc04a62f000) >>>>>> libFLAC.so.8 => /usr/lib/x86_64-linux-gnu/libFLAC.so.8 >>>>>> (0x00007fc04a3fe000) >>>>>> >>>>>> libvorbisenc.so.2 => /usr/lib/x86_64-linux-gnu/libvorbisenc.so.2 >>>>>> (0x00007fc049f2e000) >>>>>> libvorbis.so.0 => /usr/lib/x86_64-linux-gnu/libvorbis.so.0 >>>>>> (0x00007fc049d01000) >>>>>> >>>>>> libogg.so.0 => /usr/lib/x86_64-linux-gnu/libogg.so.0 >>>>>> (0x00007fc049af8000) >>>>>> libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 >>>>>> (0x00007fc0498dd000) >>>>>> >>>>>> >>>>>> # libav is not on this list because libgroove depends statically upon it >>>>>> >>>>>> >>>>>> >>>>>> here's the difference in linker steps for libgroove.so between the >>>>>> working manual build and the not-working PPA build: >>>>>> >>>>>> # ppa link step (broken): >>>>>> >>>>>> /usr/bin/cc -fPIC -g -O2 -fstack-protector --param=ssp-buffer-size=4 >>>>>> -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -O2 -g -DNDEBUG >>>>>> -Wl,-Bsymbolic -Wl,-z,relro -shared -Wl,-soname,libgroove.so.2 -o >>>>>> libgroove.so.2.0.2 CMakeFiles/groove.dir/src/queue.c.o >>>>>> CMakeFiles/groove.dir/src/loudness_detector.c.o >>>>>> CMakeFiles/groove.dir/src/buffer.c.o >>>>>> CMakeFiles/groove.dir/src/encoder.c.o CMakeFiles/groove.dir/src/file.c.o >>>>>> CMakeFiles/groove.dir/src/playlist.c.o >>>>>> CMakeFiles/groove.dir/src/global.c.o >>>>>> CMakeFiles/groove.dir/src/player.c.o >>>>>> deps/libav/install/lib/libavfilter.a >>>>>> deps/libav/install/lib/libavformat.a deps/libav/install/lib/libavcodec.a >>>>>> deps/libav/install/lib/libavresample.a >>>>>> deps/libav/install/lib/libswscale.a deps/libav/install/lib/libavutil.a >>>>>> -lbz2 -lz -lmp3lame -lpthread -Wl,-Bstatic -lSDL2main -Wl,-Bdynamic >>>>>> -lSDL2 -lpthread -Wl,-Bstatic -lebur128 -lSDL2main -Wl,-Bdynamic -lSDL2 >>>>>> -Wl,-Bstatic -lebur128 -Wl,-Bdynamic >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> # see full build log: >>>>>> https://launchpadlibrarian.net/156927161/buildlog_ubuntu-saucy-amd64.libgroove_2.0.2-2_UPLOADING.txt.gz >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> # build manually from source link step (works): >>>>>> >>>>>> >>>>>> /usr/bin/cc -fPIC -Wl,-Bsymbolic -shared -Wl,-soname,libgroove.so.2 >>>>>> -o libgroove.so.2.0.0 CMakeFiles/groove.dir/src/global.c.o >>>>>> CMakeFiles/groove.dir/src/loudness_detector.c.o >>>>>> CMakeFiles/groove.dir/src/playlist.c.o >>>>>> CMakeFiles/groove.dir/src/buffer.c.o >>>>>> CMakeFiles/groove.dir/src/encoder.c.o >>>>>> CMakeFiles/groove.dir/src/queue.c.o CMakeFiles/groove.dir/src/file.c.o >>>>>> CMakeFiles/groove.dir/src/player.c.o >>>>>> deps/libav/install/lib/libavfilter.a >>>>>> deps/libav/install/lib/libavformat.a deps/libav/install/lib/libavcodec.a >>>>>> deps/libav/install/lib/libavresample.a >>>>>> deps/libav/install/lib/libswscale.a deps/libav/install/lib/libavutil.a >>>>>> -lbz2 -lz -lmp3lame -lpthread -Wl,-Bstatic -lSDL2main -Wl,-Bdynamic >>>>>> -lSDL2 -lpthread deps/ebur128/libebur128.a -Wl,-Bstatic -lSDL2main >>>>>> -Wl,-Bdynamic -lSDL2 >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> _______________________________________________ >>>>>> Mailing list: https://launchpad.net/~launchpad-users >>>>>> Post to : launchpad-users@lists.launchpad.net >>>>>> Unsubscribe : https://launchpad.net/~launchpad-users >>>>>> More help : https://help.launchpad.net/ListHelp >>>>>> >>>>>> >>>>> >>>> >>> >> >
_______________________________________________ Mailing list: https://launchpad.net/~launchpad-users Post to : launchpad-users@lists.launchpad.net Unsubscribe : https://launchpad.net/~launchpad-users More help : https://help.launchpad.net/ListHelp