I'm glad to be of help.
On Tue, Nov 19, 2013 at 8:45 PM, Andrew Kelley <superjo...@gmail.com> wrote: > 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