development

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

big-blog 2020. 2. 23. 11:58
반응형

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


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

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

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

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


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

/home/user/myDir

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

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

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

예를 들어 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

짜잔!


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

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

apt-get install libfoo-dev

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

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

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

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


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

$ export LIBRARY_PATH=/opt/lib/

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

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

$ export LD_LIBRARY_PATH=/opt/lib/

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


컴파일 시간

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

먼저 다음과 같은 이름 지정 규칙을 알아야합니다 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


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

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

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


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

locate lxxx.so

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

sudo cp yourpath/lxxx.so /usr/lib

끝난.


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

문제 1 : 부적절한 이름

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

문제 2 : 잘못된 소유자

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

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

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

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

비표준 이름을 갖도록 링크하려고 시도한 라이브러리 (즉, 'lib'접두사가없는)는 다음과 같은 명령을 사용하여 컴파일하는 것이 좋습니다.

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


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

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이 성공적으로 설치되었습니다!

참고 URL : https://stackoverflow.com/questions/16710047/usr-bin-ld-cannot-find-lnameofthelibrary



반응형