2008-12-03 74 views
150

Tôi đang cố liên kế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.ld không thể tìm thấy thư viện hiện có

tôi kêu gọi các mối 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 để chẩn đoán vấn đề này hơn nữa, và những gì có thể sai? Tôi đang làm điều gì đó hoàn toàn ngu ngốc?

Trả lời

138

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

Một hack nhanh chóng là để liên kết mềm libmagic.so.1-libmagic.so

+3

mà làm việc, tôi loại bối rối rằng nó sẽ đặt tên cho tập tin trong một 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 tại sao nó sẽ làm điều này theo mặc định? – maxpenguin

+0

Rất có thể đó là cấu hình sai của tập lệnh cài đặt – grepsedawk

+5

Foo.so.1 cũng là một liên kết tượng trưng cho 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 một thư viện trong hệ thống của bạn, và nếu một ứng dụng cần một cái cụ thể, nó có thể liên kết với nó, trong khi nói chung, một phiên bản mới nhất được chọn bởi symlink. Tôi không biết tại sao liên kết này bị thiếu. – Svante

4

Trừ khi tôi là tồi tệ nhầm libmagic hoặc -lmagic không phải là cùng một thư viện như 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 thích hợp cho trình biên dịch.

Ex:

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

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

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

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

30

Nó là quy ước Debian để chia các thư viện chia sẻ thành các thành phần thời gian chạy của chúng (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 → …).

Vì tên son 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à -lmagic cho trình liên kết, nên tìm kiếm libmagic.so, đó là lý do tại sao cần thiết để phát triển.

Xem Diego E. Pettenò: Linkers and names để 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.so mà còn các tệp khác cần thiết để biên dịch như /usr/include/magic.h.

6

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

$ sudo apt-get install libtool 

này giải quyết một vấn đề với ltdl đối với tôi, vốn đã được cài đặt như libltdl.so.7 và không được tìm thấy một cách đơn giản -lltdl trong thực hiện.

+0

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? –

1

Cài đặt libgl1-mesa-dev từ kho lưu trữ Ubuntu đã giải quyết vấn đề này cho tôi.

+4

Chắc chắn bạn không bị lỗi cùng một tập lệnh như maxpenguin trong năm 2008. – Sophit

+0

nó giải quyết được vấn đề của tôi. bạn có thể vui lòng cung cấp thêm thông tin về nó không? và cách giải quyết vấn đề này? (ý tôi là: libgl1-mesa-dev). cảm ơn –

2

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 bộ nhớ cache cập nhật.

ldconfig -v 

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

$ ldconfig -p | grep libmagic 
Các vấn đề liên quan