ld cannot find an existing library

707,948

Solution 1

The problem is the linker is looking for libmagic.so but you only have libmagic.so.1

A quick hack is to symlink libmagic.so.1 to libmagic.so

Solution 2

As just formulated by grepsedawk, the answer lies in the -l option of g++, calling ld. If you look at the man page of this command, you can either do:

  • g++ -l:libmagic.so.1 [...]
  • or: g++ -lmagic [...] , if you have a symlink named libmagic.so in your libs path

Solution 3

It is Debian convention to separate shared libraries into their runtime components (libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0) and their development components (libmagic-dev: /usr/lib/libmagic.so → …).

Because the library's soname is libmagic.so.1, that's the string that gets embedded into the executable so that's the file that is loaded when the executable is run.

However, because the library is specified as -lmagic to the linker, it looks for libmagic.so, which is why it is needed for development.

See Diego E. Pettenò: Linkers and names for details on how this all works on Linux.


In short, you should apt-get install libmagic-dev. This will not only give you libmagic.so but also other files necessary for compiling like /usr/include/magic.h.

Solution 4

In Ubuntu, you can install libtool which resolves the libraries automatically.

$ sudo apt-get install libtool

This resolved a problem with ltdl for me, which had been installed as libltdl.so.7 and wasn't found as simply -lltdl in the make.

Solution 5

As mentioned above the linker is looking for libmagic.so, but you only have libmagic.so.1.

To solve this problem just perform an update cache.

ldconfig -v 

To verify you can run:

$ ldconfig -p | grep libmagic
Share:
707,948

Related videos on Youtube

maxpenguin
Author by

maxpenguin

Updated on July 08, 2021

Comments

  • maxpenguin
    maxpenguin almost 3 years

    I am attempting to link an application with g++ on this Debian lenny system. ld is complaining it cannot find specified libraries. The specific example here is ImageMagick, but I am having similar problems with a few other libraries too.

    I am calling the linker with:

    g++ -w (..lots of .o files/include directories/etc..) \
    -L/usr/lib -lmagic
    

    ld complains:

    /usr/bin/ld: cannot find -lmagic
    

    However, libmagic exists:

    $ locate libmagic.so
    /usr/lib/libmagic.so.1
    /usr/lib/libmagic.so.1.0.0
    $ ls -all /usr/lib/libmagic.so.1*
    lrwxrwxrwx 1 root root    17 2008-12-01 03:52 /usr/lib/libmagic.so.1 -> libmagic.so.1.0.0
    -rwxrwxrwx 1 root root 84664 2008-09-09 00:05 /usr/lib/libmagic.so.1.0.0
    $ ldd /usr/lib/libmagic.so.1.0.0 
        linux-gate.so.1 =>  (0xb7f85000)
        libz.so.1 => /usr/lib/libz.so.1 (0xb7f51000)
        libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7df6000)
        /lib/ld-linux.so.2 (0xb7f86000)
    $ sudo ldconfig -v | grep "libmagic"
        libmagic.so.1 -> libmagic.so.1.0.0
    

    How do I diagnose this problem further, and what could be wrong? Am I doing something completely stupid?

  • maxpenguin
    maxpenguin over 15 years
    that works, I am kind of perplexed that it would name the file in a completely useless way by default - can you provide any insight why it would do this by default?
  • grepsedawk
    grepsedawk over 15 years
    Most likely it is a misconfiguration of the install script
  • Svante
    Svante over 15 years
    The foo.so.1 is a symlink to foo.so.1.0.0 too. This way, you can have several versions of a library in your system, and if an application needs a specific one, it can link to it, while in general, the newest one is chosen by symlink. I do not know why this symlink was missing.
  • CesarB
    CesarB over 15 years
    libmagic.so.1 is the soname, used by the dynamic linker; libmagic.so is used by the linker, and is usually together with the headers in the -dev package. The symlink might be missing because the -dev package was not installed.
  • Trevor Boyd Smith
    Trevor Boyd Smith about 12 years
    I had the same problem... instead of doing the "hack" I installed the "*-devel" version and it fixed the compilation.
  • Andry
    Andry over 10 years
    Same problem here and got crazy for a day... Actually it is better to let libraries hanle everything and, as Trevor stated, install devel packages...
  • Sophit
    Sophit almost 10 years
    Surely you're not suffering from the same script bug as maxpenguin in 2008.
  • Black
    Black over 8 years
    How to symlink libmagic.so.1 to libmagic.so? And where to find those "devel" packages
  • phyatt
    phyatt over 7 years
    Or in summary, remove the lib prefix when linking to it when using -l. -llibmagic should be -lmagic.
  • Shahryar Saljoughi
    Shahryar Saljoughi about 7 years
    it did not solve the error cannot fine -LGL . could you please give more information on what libtool does and how it solves library issues?
  • Shahryar Saljoughi
    Shahryar Saljoughi about 7 years
    it solved my problem . could you please give more information on what it is . and how it solves this issue ? (i mean : libgl1-mesa-dev) . thanks
  • MuhsinFatih
    MuhsinFatih almost 3 years
    @Black ln -s path-to-libmagic.so.1/libmagic.so.1 path-to-libmagic.so.1/libmagic.so. Example: ln -s /usr/lib/x86_64-linux-gnu/libzstd.so.1 /usr/lib/x86_64-linux-gnu/libzstd.so