usr/bin/ld: cannot find -l

前端 未结 14 2721
离开以前
离开以前 2020-11-22 07:07

I\'m trying to compile my program and it returns this error :

usr/bin/ld: cannot find -l

in my makefile I use the c

相关标签:
14条回答
  • 2020-11-22 07:55

    I encountered the same error message.

    I built the cmocka as a so and tried to link it to my executable. But ld always complains below:

    /usr/bin/ld: cannot find -lcmocka

    It turns out that there are 3 files generated after cmocka is built:

    1. libcmocka.so
    2. libcmocka.so.0
    3. libcmocka.so.0.7.0

    1 and 2 are symbol links and only 3 is the real file.

    I only copied the 1 to my library folder, where ld failed to find the 3.

    After I copied all 3, ld works.

    0 讨论(0)
  • 2020-11-22 07:56

    If your library name is say libxyz.so and it is located on path say:

    /home/user/myDir
    

    then to link it to your program:

    g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
    
    0 讨论(0)
  • 2020-11-22 07:58

    To figure out what the linker is looking for, run it in verbose mode.

    For example, I encountered this issue while trying to compile MySQL with ZLIB support. I was receiving an error like this during compilation:

    /usr/bin/ld: cannot find -lzlib
    

    I did some Googl'ing and kept coming across different issues of the same kind where people would say to make sure the .so file actually exists and if it doesn't, then create a symlink to the versioned file, for example, zlib.so.1.2.8. But, when I checked, zlib.so DID exist. So, I thought, surely that couldn't be the problem.

    I came across another post on the Internets that suggested to run make with LD_DEBUG=all:

    LD_DEBUG=all make
    

    Although I got a TON of debugging output, it wasn't actually helpful. It added more confusion than anything else. So, I was about to give up.

    Then, I had an epiphany. I thought to actually check the help text for the ld command:

    ld --help
    

    From that, I figured out how to run ld in verbose mode (imagine that):

    ld -lzlib --verbose
    

    This is the output I got:

    ==================================================
    attempt to open /usr/x86_64-linux-gnu/lib64/libzlib.so failed
    attempt to open /usr/x86_64-linux-gnu/lib64/libzlib.a failed
    attempt to open /usr/local/lib64/libzlib.so failed
    attempt to open /usr/local/lib64/libzlib.a failed
    attempt to open /lib64/libzlib.so failed
    attempt to open /lib64/libzlib.a failed
    attempt to open /usr/lib64/libzlib.so failed
    attempt to open /usr/lib64/libzlib.a failed
    attempt to open /usr/x86_64-linux-gnu/lib/libzlib.so failed
    attempt to open /usr/x86_64-linux-gnu/lib/libzlib.a failed
    attempt to open /usr/local/lib/libzlib.so failed
    attempt to open /usr/local/lib/libzlib.a failed
    attempt to open /lib/libzlib.so failed
    attempt to open /lib/libzlib.a failed
    attempt to open /usr/lib/libzlib.so failed
    attempt to open /usr/lib/libzlib.a failed
    /usr/bin/ld.bfd.real: cannot find -lzlib
    

    Ding, ding, ding...

    So, to finally fix it so I could compile MySQL with my own version of ZLIB (rather than the bundled version):

    sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so
    

    Voila!

    0 讨论(0)
  • 2020-11-22 08:00

    I had this problem with compiling LXC on a fresh VM with Centos 7.8. I tried all the above and failed. Some suggested removing the -static flag from the compiler configuration but I didn't want to change anything.

    The only thing that helped was to install glibc-static and retry. Hope that helps someone.

    0 讨论(0)
  • 2020-11-22 08:01

    During compilation with g++ via make define LIBRARY_PATH if it may not be appropriate to change the Makefile with the -Loption. I had put my extra library in /opt/lib so I did:

    $ export LIBRARY_PATH=/opt/lib/
    

    and then ran make for successful compilation and linking.

    To run the program with a shared library define:

    $ export LD_LIBRARY_PATH=/opt/lib/
    

    before executing the program.

    0 讨论(0)
  • 2020-11-22 08:03

    There does not seem to be any answer which addresses the very common beginner problem of failing to install the required library in the first place.

    On Debianish platforms, if libfoo is missing, you can frequently install it with something like

    apt-get install libfoo-dev
    

    The -dev version of the package is required for development work, even trivial development work such as compiling source code to link to the library.

    The package name will sometimes require some decorations (libfoo0-dev? foo-dev without the lib prefix? etc), or you can simply use your distro's package search to find out precisely which packages provide a particular file.

    (If there is more than one, you will need to find out what their differences are. Picking the coolest or the most popular is a common shortcut, but not an acceptable procedure for any serious development work.)

    For other architectures (most notably RPM) similar procedures apply, though the details will be different.

    0 讨论(0)
提交回复
热议问题