ld cannot find an existing library
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
Related videos on Youtube
maxpenguin
Updated on July 08, 2021Comments
-
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 over 15 yearsthat 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 over 15 yearsMost likely it is a misconfiguration of the install script
-
Svante over 15 yearsThe 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 over 15 yearslibmagic.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 about 12 yearsI had the same problem... instead of doing the "hack" I installed the "*-devel" version and it fixed the compilation.
-
Andry over 10 yearsSame 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 almost 10 yearsSurely you're not suffering from the same script bug as maxpenguin in 2008.
-
Black over 8 yearsHow to symlink libmagic.so.1 to libmagic.so? And where to find those "devel" packages
-
phyatt over 7 yearsOr in summary, remove the
lib
prefix when linking to it when using-l
.-llibmagic
should be-lmagic
. -
Shahryar Saljoughi about 7 yearsit 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 about 7 yearsit 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 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