ld는 기존 라이브러리를 찾을 수 없습니다


169

이 데비안 레니 시스템에서 응용 프로그램을 g ++와 연결하려고합니다. ld는 지정된 라이브러리를 찾을 수 없다고 불평합니다. 여기의 특정 예는 ImageMagick이지만 몇 가지 다른 라이브러리에서도 비슷한 문제가 있습니다.

링커를 다음과 같이 호출합니다.

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

ld 불평 :

/usr/bin/ld: cannot find -lmagic

그러나 libmagic은 존재합니다 :

$ 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

이 문제를 더 진단하려면 어떻게해야합니까? 무엇이 잘못 될 수 있습니까? 내가 완전히 바보 같은 일을하고 있습니까?

답변:


158

문제는 링커가 찾고 libmagic.so있지만libmagic.so.1

빠른 해킹 심볼릭 링크이다 libmagic.so.1libmagic.so


3
그 파일은 기본적으로 완전히 쓸모없는 방식으로 파일 이름을 짓게 될 것입니다.
maxpenguin

5
foo.so.1도 foo.so.1.0.0에 대한 심볼릭 링크입니다. 이렇게하면 시스템에 여러 버전의 라이브러리가있을 수 있으며 응용 프로그램에 특정 버전의 라이브러리가 필요한 경우 해당 라이브러리에 연결할 수 있지만 일반적으로 최신 링크는 symlink에 의해 선택됩니다. 이 심볼릭 링크가없는 이유를 모르겠습니다.
Svante

46
libmagic.so.1은 동적 링커에서 사용하는 soname입니다. libmagic.so는 링커에서 사용되며 일반적으로 -dev 패키지의 헤더와 함께 사용됩니다. -dev 패키지가 설치되지 않아 symlink가 누락되었을 수 있습니다.
CesarB

13
나는 같은 문제를 겪었다. "hack"대신 "* -devel"버전을 설치하고 컴파일을 수정했다.
Trevor Boyd Smith

4
libmagic.so.1을 libmagic.so에 연결하는 방법? "devel"패키지를 찾을 수있는 곳
Black

68

grepsedawk에 의해 공식화 된 것처럼 대답은 , 전화 -l옵션에 있습니다. 이 명령의 매뉴얼 페이지를 보면 다음 중 하나를 수행 할 수 있습니다.g++ld

  • g++ -l:libmagic.so.1 [...]
  • 또는 : g++ -lmagic [...]libs 경로에 libmagic.so라는 심볼릭 링크가있는 경우

또는 요약 lib하면을 사용할 때 접두사를 연결할 때 제거하십시오 -l. -llibmagic이어야합니다 -lmagic.
phyatt

31

공유 라이브러리를 런타임 컴포넌트 ( libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0)와 개발 컴포넌트 ( libmagic-dev: /usr/lib/libmagic.so → …) 로 분리하는 것이 데비안 규칙 입니다.

라이브러리의 soname은 libmagic.so.1이므로 실행 파일에 포함되는 문자열이므로 실행 파일이 실행될 때로드되는 파일입니다.

그러나 라이브러리가 -lmagic링커에 대해 지정 되었기 때문에 라이브러리를 찾게되므로 libmagic.so개발에 필요합니다.

이것이 Linux에서 어떻게 작동하는지에 대한 자세한 내용 은 Diego E. Pettenò : 링커 및 이름 을 참조하십시오.


한마디로, 당신은해야합니다 apt-get install libmagic-dev. 이것은 당신에게 libmagic.so뿐만 아니라 같은 컴파일에 필요한 다른 파일을 제공 할 것 /usr/include/magic.h입니다.


7

우분투에서는 libtool라이브러리를 자동으로 해결하는 설치 가 가능합니다.

$ sudo apt-get install libtool

이것은 ltdl나를 위해 문제를 해결 했는데, 그것은 libltdl.so.7단순히 -lltdlmake에서 설치되었지만 찾지 못했던 것입니다.


-LGL을 잘 수행 할 수 없다는 오류를 해결하지 못했습니다 . libtool의 기능과 라이브러리 문제를 해결하는 방법에 대한 자세한 정보를 제공 할 수 있습니까?
Shahryar Saljoughi

4

내가 잘못 착각 하지 않았 libmagic거나 -lmagicImageMagick과 같은 라이브러리가 아닌 한. ImageMagick을 원한다고 진술했습니다.

ImageMagick은 모든 적절한 옵션을 컴파일러에 제공하는 유틸리티와 함께 ​​제공됩니다.

전의:

g++ program.cpp `Magick++-config --cppflags --cxxflags --ldflags --libs` -o "prog"

4

위에서 언급했듯이 링커는 찾고 libmagic.so있지만 당신은 가지고 있습니다 libmagic.so.1.

이 문제를 해결하려면 업데이트 캐시 만 수행하십시오.

ldconfig -v 

다음을 실행할 수 있는지 확인하십시오.

$ ldconfig -p | grep libmagic

1

우분투 저장소에서 libgl1-mesa-dev를 설치하면이 문제가 해결되었습니다.


5
확실히 당신은 2008 년에 maxpenguin과 같은 스크립트 버그로 고통받지 않습니다.
Sophit

내 문제를 해결했다. 당신은 그것이 무엇인지에 대한 자세한 정보를 제공 할 수 있습니까? 어떻게이 문제를 해결합니까? (즉, libgl1-mesa-dev). 감사
Shahryar Saljoughi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.