Tôi không thể tìm thấy một thư viện hiện có


169

Tôi đang cố gắng liên kết một ứng dụng với g ++ trên hệ thống lenny Debian này. ld đang phàn nàn nó không thể tìm thấy các thư viện được chỉ định. Ví dụ cụ thể ở đây là ImageMagick, nhưng tôi cũng gặp vấn đề tương tự với một vài thư viện khác.

Tôi đang gọi trình liên kết với:

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

ld phàn nàn:

/usr/bin/ld: cannot find -lmagic

Tuy nhiên, libmagic tồn tại:

$ 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

Làm thế nào để tôi chẩn đoán vấn đề này hơn nữa, và điều gì có thể sai? Tôi đang làm một cái gì đó hoàn toàn ngu ngốc?

Câu trả lời:


158

Vấn đề là trình liên kết đang tìm kiếm libmagic.sonhưng bạn chỉ cólibmagic.so.1

Một cách nhanh chóng là để liên kết libmagic.so.1đếnlibmagic.so


3
Điều đó hoạt động, tôi hơi bối rối rằng nó sẽ đặt tên tệp theo cách hoàn toàn vô dụng theo mặc định - bạn có thể cung cấp bất kỳ cái nhìn sâu sắc nào tại sao nó sẽ làm điều này theo mặc định?
maxpenguin

5
Foo.so.1 cũng là một liên kết tượng trưng đến foo.so.1.0.0. Bằng cách này, bạn có thể có một vài phiên bản của thư viện trong hệ thống của mình và nếu một ứng dụng cần một phiên bản cụ thể, nó có thể liên kết với nó, trong khi nói chung, phiên bản mới nhất được chọn bởi symlink. Tôi không biết tại sao symlink này bị thiếu.
Svante

46
libmagic.so.1 là soname, được sử dụng bởi trình liên kết động; libmagic.so được sử dụng bởi trình liên kết và thường cùng với các tiêu đề trong gói -dev. Symlink có thể bị thiếu vì gói -dev chưa được cài đặt.
CesarB

13
Tôi gặp vấn đề tương tự ... thay vì thực hiện "hack", tôi đã cài đặt phiên bản "* -devel" và nó đã sửa lỗi biên dịch.
Trevor Boyd Smith

4
Làm cách nào để liên kết libmagic.so.1 đến libmagic.so? Và nơi để tìm các gói "phát" đó
Đen

68

Như được xây dựng bởi grepsedawk, câu trả lời nằm ở -ltùy chọn g++, gọi ld. Nếu bạn nhìn vào trang man của lệnh này, bạn có thể làm:

  • g++ -l:libmagic.so.1 [...]
  • hoặc : g++ -lmagic [...], nếu bạn có một liên kết tượng trưng có tên libmagic.so trong đường dẫn libs của bạn

Hoặc tóm lại, loại bỏ libtiền tố khi liên kết với nó khi sử dụng -l. -llibmagicnên -lmagic.
phyatt

31

Đó là quy ước Debian để tách các thư viện chia sẻ thành các thành phần thời gian chạy ( libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0) và các thành phần phát triển của chúng ( libmagic-dev: /usr/lib/libmagic.so → …).

Bởi vì soname của thư viện là libmagic.so.1, đó là chuỗi được nhúng vào tệp thực thi nên đó là tệp được tải khi tệp thực thi được chạy.

Tuy nhiên, vì thư viện được chỉ định là -lmagicliên kết, nó tìm kiếm libmagic.so, đó là lý do tại sao nó cần thiết cho sự phát triển.

Xem Diego E. Pettenò: Trình liên kết và tên để biết chi tiết về cách tất cả hoạt động trên Linux.


Tóm lại, bạn nên apt-get install libmagic-dev. Điều này sẽ không chỉ cung cấp cho bạn libmagic.somà còn các tệp khác cần thiết để biên dịch như thế nào /usr/include/magic.h.


7

Trong Ubuntu, bạn có thể cài đặt libtooltự động giải quyết các thư viện.

$ sudo apt-get install libtool

Điều này đã giải quyết một vấn đề với ltdltôi, đã được cài đặt libltdl.so.7và không được tìm thấy đơn giản như -lltdltrong sản xuất.


nó không giải quyết được lỗi không thể tốt -LGL . bạn có thể vui lòng cung cấp thêm thông tin về những gì libtool làm và cách nó giải quyết các vấn đề thư viện?
Shahryar Saljoughi

4

Trừ khi tôi nhầm lẫn libmagichoặc -lmagickhông cùng thư viện với ImageMagick. Bạn nói rằng bạn muốn ImageMagick.

ImageMagick đi kèm với một tiện ích để cung cấp tất cả các tùy chọn phù hợp cho trình biên dịch.

Ví dụ:

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

4

Như đã đề cập ở trên trình liên kết đang tìm kiếm libmagic.so, nhưng bạn chỉ có libmagic.so.1.

Để giải quyết vấn đề này chỉ cần thực hiện một bộ đệm cập nhật.

ldconfig -v 

Để xác minh bạn có thể chạy:

$ ldconfig -p | grep libmagic

1

Cài đặt libgl1-mesa-dev từ Ubuntu repo đã giải quyết vấn đề này cho tôi.


5
Chắc chắn bạn không mắc phải lỗi kịch bản tương tự như maxpenguin năm 2008
Sophit

nó đã giải quyết vấn đề của tôi bạn có thể vui lòng cho biết thêm thông tin về nó là gì và làm thế nào nó giải quyết vấn đề này? (ý tôi là: libgl1-mesa-dev). cảm ơn
Shahryar Saljoughi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.