2009-12-02 22 views
5

Dưới đây là tình hình hiện nay tôi đang ở:Linking một ứng dụng để libbz2.so.1 hơn libbz2.so.1.0

tôi muốn phân phối một ứng dụng nhị phân trên Linux mà có thể chạy trên nhiều distro (không phải tất cả trong số đó, chỉ là vấn đề chính hiện tại, hãy tập trung vào Ubuntu và Fedora vì mục đích của cuộc thảo luận này). Liên kết ứng dụng trong câu hỏi tới libbz2 cho một số tác phẩm của nó. Một đơn giản "Hello World" sẽ minh họa tình hình:

/* main.cpp */ 
#include <iostream> 

int main(int argc, char* argv[]) 
{ 
    std::cout << "Hello World!\n"; 
    return 0; 
} 

Ứng dụng được xây dựng như vậy:

g++ -lbz2 -o test.bin main.cpp 

xây dựng hệ thống của tôi là trên Ubuntu. Khi tôi thực hiện một kiểm tra với ldd trên nhị phân kết quả, nó liệt kê libbz2.so.1.0 như là một phụ thuộc thời gian chạy. Khi tôi đưa ứng dụng này vào một máy Fedora, ứng dụng không chạy và ldd tiết lộ rằng nó không thể tìm thấy libbz2.so.1.0. Fedora chỉ có libbz2.so.1libbz2.so.1.0.4, nhưng không phải libbz2.so.1.0.

Red Hat's Bugzilla database cho thấy rằng hành vi này không phải là lỗi, mà là một tính năng. Tôi không thực sự cần libbz2.so.1.0, và tôi sẽ hài lòng với cách đơn giản là liên kết tới libbz2.so.1, nhưng tôi vẫn chưa tìm ra cách.

Tôi đã thấy số similar question asked here previously, nhưng câu trả lời được chấp nhận (Bạn có thể chuyển tệp .so thực thay vì -l trên dòng lệnh trình liên kết) dường như không hoạt động. Tôi đã cố gắng xây dựng với lệnh sau đây:

g++ /lib/libbz2.so.1 -o test.bin main.cpp 

Tuy nhiên, ldd vẫn nói rằng ứng dụng phụ thuộc vào libbz2.so.1.0, mặc dù tôi đã thông qua toàn bộ tên g ++.

Bây giờ, câu hỏi đặt ra là, có cách nào trên Ubuntu để xây dựng ứng dụng để nó chỉ phụ thuộc vào libbz2.so.1 thay vì trên libbz2.so.1.0?

Cảm ơn.

Trả lời

3

Tại sao bạn không chỉ liên kết tĩnh?

Tôi đã làm điều đó trong quá khứ để xây dựng trên Ubuntu và triển khai trên RHEL hoạt động tốt bằng cách sử dụng các bản dựng tĩnh.

+0

* facepalm * ... bởi vì điều đó quá rõ ràng. Vì một lý do nào đó tôi đã cho rằng bzip2 sẽ được cấp phép LGPL, điều này ngăn chặn liên kết tĩnh, nhưng có vẻ như đó là BSD, cho phép nó ... Liên kết tĩnh là sau đó. Cảm ơn. – Fred

+1

Không đổ mồ hôi. Nhưng tại sao bạn nghĩ LGPL có bất cứ điều gì để nói về cách bạn liên kết? Bạn có thể sử dụng các liên kết tĩnh hoặc động với mã LGPL và GPL - các hạn chế của bạn là cách bạn phân phối ứng dụng, v.v. và liệu bạn có phải cung cấp mã nguồn hay không. Điều đó hoàn toàn độc lập với quá trình xây dựng của bạn. –

+3

Ok, tôi phải chính xác hơn. LGPL cấm liên kết tĩnh vào một ứng dụng độc quyền. Đối với những người đang tìm câu trả lời đầy đủ, dưới đây là cách thực hiện nếu bạn muốn liên kết tĩnh với * some * libs và tự động với * some * libs khác: g ++ -Wl, -Bstatic -lbz2 -Wl, - Bdynamic -lotherlib -o test.bin main.cpp – Fred

4

Dưới đây là một chút thông tin cơ bản để giải thích những gì đã được liên kết. Trên nền tảng ELF, các cờ -L và -l mà bạn vượt qua chỉ xác định vị trí nhị phân tại thời gian liên kết. Nếu trình liên kết trình liên kết xác định rằng một thư viện là bắt buộc, nó tạo ra một tham chiếu đến SONAME trong nhị phân đó, bất kể nó được gọi là gì. Ví dụ:

 
$ objdump -p /lib64/libbz2.so.1 | grep SONAME 
    SONAME  libbz2.so.1 

Vì vậy, bất kể tên libbz2 được đặt tên, đó là những gì sẽ hiển thị dưới dạng phụ thuộc. Một lần nữa bằng ví dụ, làm một cái gì đó hoàn toàn cú đánh:

 
$ ln -s /lib64/libbz2.so.1 libblah.so 
$ g++ t.C -L. -l blah 

Bạn có apparency là đã liên quan đến libblah nhưng vì nó là SONAME ở chỗ nhị phân có vấn đề, sự phụ thuộc của bạn vẫn được libbz2.so.1 này

 
$ ldd a.out | grep bz2 
     libbz2.so.1 => /lib64/libbz2.so.1 (0x00002b3d1a000000) 

Khác với thủ thuật có thể phá vỡ mọi thứ theo cách thú vị, không có cách nào dễ dàng thoát khỏi mớ hỗn độn (lý tưởng là thư viện sẽ làm biểu tượng đẹp như glibc và không bao giờ hoặc hiếm khi thay đổi SONAME).

+0

nó thậm chí có thể là ví dụ mạnh hơn với cp /lib64/libbz2.so.1 libblah.so thay vì ln (nếu ai đó nghĩ rằng ld bằng cách nào đó theo dõi tên thành libbz2 .so.1 – Jaro

Các vấn đề liên quan