usr / bin / ld : -l <nameOfTheLibrary>을 찾을 수 없습니다


443

프로그램을 컴파일하려고 하는데이 오류가 반환됩니다.

usr/bin/ld: cannot find -l<nameOfTheLibrary>

내 makefile에서 명령을 사용하고 g++다른 디렉토리에있는 내 라이브러리에 대한 심볼릭 링크 인 내 라이브러리에 대한 링크를 사용합니다.

제대로 작동하도록 추가 할 수있는 옵션이 있습니까?


1
더 많은 정보가 필요합니다. 프로그램을 컴파일하기 위해 어떤 명령을 발행 했습니까? make -n your-target 을 사용 하여 일반적으로 호출하는 명령을 인쇄하도록 할 수 있습니다.
djf

makefile 또는 실행 한 명령을 게시하십시오.
Ortwin Angermeier

내 명령은 이것입니다 : g ++-<options> objetc1.o objetc2.o objetc3.o objetc4.o -L <pathOfTheLibrary> -l <nameOfTheLibrary> -lpthread -o myexe
ZoOo

4
연결하려는 라이브러리가 동일한 아키텍처 (예 : 32/64 비트)로 빌드 되었습니까? 라이브러리가 사용자 정의 라이브러리와 연결되어 있습니까? 라이브러리 이름은 -l스위치를 사용할 때 lib <name>으로 시작해야하기 때문에 중요 합니다 (예 : 이미 링크 된 libpthread.so).
Ortwin Angermeier

1
문제는 라이브러리의 심볼릭 링크에 좋지 않았습니다. 당신의 도움을 주셔서 감사합니다 !
ZoOo

답변:


196

라이브러리 이름이 말하고 libxyz.so경로에 있으면 :

/home/user/myDir

그런 다음 프로그램에 연결하십시오.

g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog

11
내 라이브러리는 동적 라이브러리 (.so)가 아니라 정적 라이브러리 (.a)입니다. 문제가 그로부터 나옵니까?
ZoOo

3
일반적으로 중요하지 않은 @ZoOo, 링커는 둘 중 하나와 함께 작동 할 수 있습니다.
djf

7
라이브러리를 연결하는 또 다른 방법은 g ++와 같이 완전한 경로를 사용하여 라이브러리 이름을 직접 지정할 수 있다는 것입니다 .. /path/mylib.a
Saurabh Bhola

2
예, 그래도 작동하지 않습니다. 내 라이브러리는 심볼릭 링크입니다. 다른 디렉토리에서 라이브러리를 사용할 때 작동하기 때문에 문제가 발생했다고 생각합니다!
ZoOo

2
심볼릭 링크가 실제 위치에서 라이브러리를 올바르게 가리키는가 ??. 기호 링크에 "ll"의 출력을 게시 할 수 있습니다.
Saurabh Bhola 10

451

링커가 무엇을 찾고 있는지 알아 보려면 상세 모드로 실행하십시오.

예를 들어 ZLIB를 지원하는 MySQL을 컴파일하는 중에이 문제가 발생했습니다. 컴파일하는 동안 다음과 같은 오류가 발생했습니다.

/usr/bin/ld: cannot find -lzlib

나는 Googl'ing을하고 사람들이 .so 파일이 실제로 존재하는지 확인하고 존재하지 않으면 zlib와 같은 버전이 지정된 파일에 대한 심볼릭 링크를 만드는 동일한 종류의 다른 문제를 계속 발견했습니다. 그래서 1.2.8. 그러나 확인했을 때 zlib.so DID가 존재합니다. 그래서 나는 그것이 문제가 될 수 없다고 생각했습니다.

인터넷에서 LD_DEBUG = all로 make를 실행하도록 제안한 다른 게시물을 발견했습니다.

LD_DEBUG=all make

TON의 디버깅 출력을 얻었지만 실제로 도움이되지는 않았습니다. 그것은 다른 것보다 더 혼란을 더했습니다. 그래서 포기하려고 했어요.

그리고 나는 주현절이있었습니다. 실제로 ld 명령에 대한 도움말 텍스트를 확인하려고 생각했습니다.

ld --help

그로부터 자세한 모드로 ld를 실행하는 방법을 알아 냈습니다.

ld -lzlib --verbose

이것은 내가 얻은 출력입니다.

==================================================
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

딩, 딩, 딩 ...

따라서 마침내 수정하여 번들 버전이 아닌 자체 ZLIB 버전으로 MySQL을 컴파일 할 수 있습니다.

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

짜잔!


60
감사합니다. 도움이되었습니다. ld를 사용하지 않고 gcc를 사용하여 프로그램을 컴파일하고 링크하는 다른 사용자의 경우 -Xlinker --verbosegcc의 명령 행 인수에 추가 하여이 옵션을 ld에 전달할 수 있습니다.

5
이것은 또한 나를 도왔다. 내가 가진 Makefile은 정적 라이브러리 만 기대했기 때문에 사용했다 -Wl,-Bstatic. 검색이 .a 파일로만 제한됩니다. 자세한 옵션은 이것을 명확하게 보여주었습니다. -Wl,-Bstatic공유 라이브러리를 제거한 후에도 검색했습니다.
micah94

2
저는 FreeBSD 10을 사용하고 있습니다. 새로운 LLVM Clang cc는 형식의 인수를 취하여 링커에 -Wl,--verbose전달 --verbose합니다.
Christian Campbell

7
이것이 바로 완벽한 답변입니다. 고마워 많은 시간을 절약했습니다. 나와 같은 사람을 돕기 위해 추가하기 만하면됩니다. 경로 관련 문제도 디버깅하는 데 사용할 수 있습니다. 명령을 사용하여 당신이 -L <디렉토리 경로>로 경로를 확인하십시오, LD -L <경로> -l <라이브러리 이름> --verbose
sbhatt

2
@EdwardBlack이 답변을 참조하십시오 . 기본적으로 gcc의 -Wl,--verbose경우 링커에 자세한 정보를 전달하기 위해 추가하십시오 .
chembrad

46

필요한 라이브러리를 처음에 설치하지 못하는 일반적인 초보자 문제를 해결하는 답변이없는 것 같습니다.

Debianish 플랫폼에서 libfoo누락 된 경우 다음과 같은 방법으로 자주 설치할 수 있습니다

apt-get install libfoo-dev

-dev패키지의 버전은 라이브러리에 링크에 소스 코드를 컴파일으로, 개발 작업에 대해서도 사소한 개발 작업이 필요합니다.

패키지 이름은 때때로 약간의 장식 (필요 libfoo0-dev? foo-dev없이 lib접두사? 등), 또는 당신은 단순히 당신의 배포판의 사용할 수있는 패키지 검색을 패키지는 특정 파일을 제공하는 정확하게 알아.

(하나 이상인 경우 차이점이 무엇인지 찾아야합니다. 가장 시원하거나 가장 인기있는 것을 선택하는 것이 일반적인 지름길이지만 심각한 개발 작업에 허용되는 절차는 아닙니다.)

다른 아키텍처 (대부분 RPM)의 경우 유사한 절차가 적용되지만 세부 사항은 다릅니다.


3
이것은 내가 새로운 서버와 Perl과 관련된 문제를 해결하는 데 도움이되었습니다. apt-get install libperl-dev나를 위해 정렬했습니다. 감사합니다 :)
Andrew Newby

1
이! 메이크 엉망 할 필요가 없습니다
바이런 틀록

이것은 아마도 가장 일반적인 해결책이며 CentOS 7에서 선인장 척추를 컴파일하는 데 도움이되었습니다 yum install openssl-devel. 간단한 해결책.
djluko

1
이것은 .so로 끝나는 심볼릭 링크가없는 것을 발견했을 때 가장 좋은 해결책이지만, 심볼릭 링크를 만드는 대신 libfoo.so.6-> libfoo.so.6.0.2와 같은 심볼릭 링크가 있습니다. 손. (libfoo 패키지가 설치되었지만 libfoo-dev는 설치되지 않았다는 의미)
dmaestro12

39

컴파일 시간

g는 ++ 말할 때 cannot find -l<nameOfTheLibrary>, 파일을 찾았 그 g ++를 의미 lib{nameOfTheLibrary}.so하지만, 공유 라이브러리 검색 경로, 기본 포인트에 의해 그것을 찾을 수 없습니다 /usr/lib/usr/local/lib다른 곳 어쩌면.

이 문제를 해결하려면 lib{nameOfTheLibrary}.so해당 검색 경로에 라이브러리 파일 ( )을 제공하거나 -L명령 옵션을 사용해야 합니다. -L{path}g ++에게 (실제로 ld) {path}기본 경로 외에도 경로 에서 라이브러리 파일을 찾도록 지시합니다 .

예 : 에 라이브러리가 /home/taylor/libswift.so있고 앱을이 라이브러리에 연결하려고 한다고 가정합니다 . 이 경우 g ++에 다음 옵션을 제공해야합니다.

g++ main.cpp -o main -L/home/taylor -lswift
  • 주 1 : -l옵션은 라이브러리 이름을 가져옵니다 없이 lib 그리고 .so그 시작과 끝에.

  • 참고 2 : 경우에 따라 라이브러리 파일 이름 뒤에 버전이옵니다 libswift.so.1.2. 이 경우 g ++도 라이브러리 파일을 찾을 수 없습니다. 에이 문제를 해결하는 간단한 해결 방법은 심볼릭 링크를 만드는 것입니다 libswift.so.1.2라고 libswift.so.


실행 시간

앱을 공유 라이브러리에 연결하는 경우 앱을 실행할 때마다 라이브러리를 계속 사용할 수 있어야합니다. 런타임에 앱 (실제로 동적 링커)은에서 라이브러리를 찾습니다 LD_LIBRARY_PATH. 경로 목록을 저장하는 환경 변수입니다.

예제 : 예제의 경우 libswift.so동적 링커 libswift.so에서 찾을 수 없습니다 LD_LIBRARY_PATH(기본 검색 경로를 가리킴). 문제를 해결하려면 경로에 해당 변수를 추가해야합니다 libswift.so.

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/taylor

게시물 주셔서 감사합니다! .so파일을에 복사 할 때까지 모든 답변을 무시하고 /usr/lib있었지만 export도움이 되는지 여부 는 흥미로 웠습니다 . make더 오래 계속 된 설치 프로세스에도 불구하고 다른 오류가 발생했습니다. 이번에는 .so.0파일을 찾을 수 없지만 소스와 종속 패키지를 빌드 한 디렉토리에 파일 .so.so.0파일이 모두 있었습니다. 도움이 될 수 있습니까?
A.Ametov

33

g++via makedefine으로 컴파일하는 동안 옵션으로 LIBRARY_PATHMakefile을 변경하는 것이 적절하지 않은지 여부 -L. 추가 라이브러리를 넣었 /opt/lib으므로 다음과 같이했습니다.

$ export LIBRARY_PATH=/opt/lib/

그런 다음 make성공적인 컴파일 및 연결을 위해 실행 했습니다.

공유 라이브러리로 프로그램을 실행하려면 다음을 정의하십시오.

$ export LD_LIBRARY_PATH=/opt/lib/

프로그램을 실행하기 전에.


14

먼저 다음과 같은 이름 지정 규칙을 알아야합니다 lxxx.

/usr/bin/ld: cannot find -lc
/usr/bin/ld: cannot find -lltdl
/usr/bin/ld: cannot find -lXtst

lc의미 libc.so, lltdl의미 libltdl.so, lXtst의미 libXts.so.

그래서, 그것이 lib+ lib-name+.so


이름을 알고 나면 locatelxxx.so파일 의 경로를 찾을 수 있습니다 .

$ locate libiconv.so
/home/user/anaconda3/lib/libiconv.so   # <-- right here
/home/user/anaconda3/lib/libiconv.so.2
/home/user/anaconda3/lib/libiconv.so.2.5.1
/home/user/anaconda3/lib/preloadable_libiconv.so
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so.2
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so.2.5.1
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/preloadable_libiconv.so

찾을 수 없으면 yum(CentOS를 사용 하여) 설치해야합니다 . 일반적으로이 파일이 있지만 올바른 위치에 링크되지 않습니다.


올바른 위치에 연결하십시오. 일반적으로 /lib64또는/usr/lib64

$ sudo ln -s /home/user/anaconda3/lib/libiconv.so /usr/lib64/

끝난!

심판 : https://i-pogo.blogspot.jp/2010/01/usrbinld-cannot-find-lxxx.html


4
locate설치되어 정기적으로 실행되는 경우에만 작동합니다. 적절한 해결 방법은 find전체 디스크에서 실행 하는 것이지만 물론 시간이 걸립니다. 자주하는 일이 발견되면 locate이 작업의 (대화식, 인적) 비용을 낮추기 위해 설치하는 것이 좋습니다.
tripleee

5

프로그램을 컴파일 할 때 라이브러리의 경로를 제공해야합니다. g ++에서 -L 옵션을 사용하십시오.

g++ myprogram.cc -o myprogram -lmylib -L/path/foo/bar

1
링크 된 플래그로 생성 ccmake되도록 어떤 속성을 변경해야 Makefile합니까? 내 -lARToolkitPlus깃발을 경로 에 연결하고 싶습니다 .
Shashwat

2

심볼릭 링크가 동적 라이브러리 .so 인 경우에도이 오류가 발생할 수 있지만 레거시 이유로 인해 -static링크 플래그 사이에 나타납니다. 그렇다면 제거하십시오.


2

라이브러리의 위치를 ​​확인하십시오 (예 : lxxx.so).

locate lxxx.so

/usr/lib폴더에 없으면 다음을 입력하십시오.

sudo cp yourpath/lxxx.so /usr/lib

끝난.


4
라이브러리를 시스템 디렉토리에 복사 할 때는주의해야합니다.
Paul Floyd

2

이미 제공된 답변 외에도 * .so 파일이 존재하지만 이름이 올바르게 지정되지 않은 경우도 있습니다. 또는 * .so 파일이 존재하지만 다른 사용자 / 루트가 소유 한 경우 일 수 있습니다.

문제 1 : 부적절한 이름

파일을 링크하는 경우 -l<nameOfLibrary> 라이브러리 파일 이름은 형식이어야 합니다. 파일 lib<nameOfLibrary> 만있는 경우 <nameOfLibrary>.so파일 이름을 바꾸십시오!

문제 2 : 잘못된 소유자

이것이 문제가 아닌지 확인하려면-수행

ls -l /path/to/.so/file

파일이 루트 또는 다른 사용자가 소유 한 경우 수행해야합니다.

sudo chown yourUserName:yourUserName /path/to/.so/file

1

내가 연결하려고하는 라이브러리는 비표준 이름 (예 : 'lib'접두사가없는)으로 밝혀 졌으므로 컴파일하는 데 다음과 같은 명령을 사용하는 것이 좋습니다.

gcc test.c -Iinclude lib/cspice.a -lm


표준 이름을 얻기 위해 "lib"접두사 만 붙임
el_technic0

1

여기 내 노트북의 우분투 정보가 있습니다.

lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.2 LTS
Release:    18.04
Codename:   bionic

boost_filesystem 및 boost_system의 .so 파일을 찾기 위해 locate를 사용합니다.

locate libboost_filesystem
locate libboost_system

그런 다음 .so 파일을 / usr / lib에 연결하고 .so로 이름을 바꿉니다.

sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.65.1 /usr/lib/libboost_filesystem.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 /usr/lib/libboost_system.so

끝난! R 패키지 velocyto.R이 성공적으로 설치되었습니다!


1

같은 오류 메시지가 나타납니다.

나는를 구축 cmockaA와 so내 실행에 연결하기 위해 노력했다. 그러나 ld항상 아래에 불평합니다.

/ usr / bin / ld : -lcmocka를 찾을 수 없습니다

cmocka빌드 후 생성 된 3 개의 파일이 있음이 밝혀 졌습니다.

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

1과 2는 심볼 링크이며 3은 실제 파일입니다.

나는 1을 내 라이브러리 폴더로 복사했는데 ld3은 찾지 못했습니다.

3을 모두 복사 한 후 ld작동합니다.


"내 라이브러리 폴더"아래에서 어떤 폴더를 의미하는지 말해 줄 수 있습니까?
A.Ametov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.