Câu trả lời:
Tham khảo:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
Bạn cần phiên bản tĩnh của thư viện để liên kết nó.
Một thư viện chia sẻ thực sự là một tệp thực thi trong một định dạng đặc biệt với các điểm nhập được chỉ định (và một số vấn đề về địa chỉ dính kèm). Nó không có tất cả các thông tin cần thiết để liên kết tĩnh.
Bạn không thể liên kết tĩnh một thư viện dùng chung (hoặc tự động liên kết một thư viện tĩnh).
Cờ -static
sẽ buộc trình liên kết sử dụng các thư viện tĩnh (.a) thay vì các thư viện được chia sẻ (.so). Nhưng các thư viện tĩnh không phải lúc nào cũng được cài đặt theo mặc định, vì vậy bạn có thể phải tự cài đặt thư viện tĩnh.
Một cách tiếp cận khác có thể là sử dụng statifier hoặc Ermine . Cả hai công cụ đều lấy đầu vào là một thực thi được liên kết động và như đầu ra tạo ra một thực thi độc lập với tất cả các thư viện chia sẻ được nhúng.
Nếu bạn muốn liên kết, nói, libapplejuice tĩnh, nhưng không, nói, liborangejuice , bạn có thể liên kết như thế này:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
Có một cảnh báo - nếu liborangejuice
sử dụng libapplejuice
, thì libapplejuice
cũng sẽ được liên kết động.
Bạn sẽ phải liên kết liborangejuice
tĩnh cùng với libapplejuice
để có được libapplejuice
tĩnh.
Và đừng quên giữ cho -Wl,-Bdynamic
người khác cuối cùng bạn sẽ liên kết mọi thứ tĩnh, bao gồm libc
(đó không phải là điều nên làm).
gcc -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L.
libB sử dụng libA , nó được liên kết và ldd
không hiển thị tham chiếu đến libA . Việc thực thi hoạt động tốt. Đã thử nghiệm với g ++ 4.7.3.
Nếu bạn có tệp .a của thư viện dùng chung (.so), bạn có thể chỉ cần đưa nó vào đường dẫn đầy đủ của nó như thể đó là một tệp đối tượng, như thế này:
Điều này tạo ra main.o chỉ bằng cách biên dịch:
gcc -c main.c
Điều này liên kết tệp đối tượng với thư viện tĩnh tương ứng và tạo tệp thực thi (được đặt tên là "chính"):
gcc main.o mylibrary.a -o main
Hoặc trong một lệnh duy nhất:
gcc main.c mylibrary.a -o main
Nó cũng có thể là một con đường tuyệt đối hoặc tương đối:
gcc main.c /usr/local/mylibs/mylibrary.a -o main
Vâng, tôi biết đây là một câu hỏi 8 năm, nhưng tôi được cho biết rằng có thể liên kết tĩnh với thư viện đối tượng dùng chung và đây thực sự là mục tiêu hàng đầu khi tôi tìm kiếm thêm thông tin về nó.
Để thực sự chứng minh rằng không thể liên kết tĩnh thư viện đối tượng dùng chung với ld
( gcc
trình liên kết) - trái ngược với chỉ một nhóm người khăng khăng rằng không thể - sử dụng gcc
lệnh sau :
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(Tất nhiên bạn sẽ phải biên dịch objectname.o
từ sourcename.c
và có lẽ bạn cũng nên tạo thư viện đối tượng chia sẻ của riêng mình. Nếu bạn làm như vậy, hãy sử dụng -Wl,--library-path,.
để ld có thể tìm thấy thư viện của bạn trong thư mục cục bộ.)
Lỗi thực tế bạn nhận được là:
/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status
Mong rằng sẽ giúp.
Hơi muộn một chút nhưng ... tôi đã tìm thấy một liên kết mà tôi đã lưu vài năm trước và tôi nghĩ nó có thể hữu ích cho các bạn:
CDE: Tự động tạo các ứng dụng Linux di động
http://www.pgbovine.net/cde.html
Thực hiện chuyển nhị phân dưới dạng đối số tên của nhị phân bạn muốn thực hiện, ví dụ: nmap
./cde_2011-08-15_64bit nmap
Chương trình sẽ đọc tất cả các lib được liên kết với nmap và các tệp phụ thuộc của nó và nó sẽ lưu tất cả chúng trong một thư mục có tên là cde-pack / (trong cùng thư mục mà bạn đang có).
Hãy nhớ rằng, để khởi chạy chương trình di động, bạn phải thực hiện nhị phân nằm trong cde-pack / nmap.cde
Trân trọng
Trong gcc, điều này không được hỗ trợ. Trong thực tế, điều này không được hỗ trợ trong bất kỳ trình biên dịch / trình liên kết hiện có nào mà tôi biết.