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.1
và libbz2.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.
* 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
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. –
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