Lihat:
http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/
Anda memerlukan versi statis pustaka untuk menautkannya.
Pustaka bersama sebenarnya dapat dieksekusi dalam format khusus dengan titik masuk yang ditentukan (dan beberapa masalah pengalamatan lengket disertakan). Itu tidak memiliki semua informasi yang diperlukan untuk menautkan secara statis.
Anda tidak dapat menautkan pustaka bersama secara statis (atau menautkan pustaka statis secara dinamis).
Bendera -static
akan memaksa linker untuk menggunakan pustaka statis (.a) alih-alih yang dibagikan (.so). Namun pustaka statis tidak selalu dipasang secara default, jadi Anda mungkin harus memasang pustaka statis sendiri.
Pendekatan lain yang mungkin adalah menggunakan statifier atau Ermine. Kedua alat mengambil sebagai input yang dapat dieksekusi yang terhubung secara dinamis dan sebagai output membuat file yang dapat dieksekusi mandiri dengan semua pustaka bersama yang disematkan.
Jika Anda memiliki file .a dari pustaka bersama (.so), Anda cukup menyertakannya dengan jalur lengkapnya seolah-olah itu adalah file objek, seperti ini:
Ini menghasilkan main.o hanya dengan mengkompilasi:
gcc -c main.c
Ini menautkan file objek tersebut dengan perpustakaan statis yang sesuai dan membuat yang dapat dieksekusi (bernama "utama"):
gcc main.o mylibrary.a -o main
Atau dalam satu perintah:
gcc main.c mylibrary.a -o main
Itu juga bisa berupa jalur absolut atau relatif:
gcc main.c /usr/local/mylibs/mylibrary.a -o main
Jika Anda ingin menautkan, katakanlah, libapplejuice secara statis, tetapi tidak, katakanlah, liborangejuice , Anda dapat menautkan seperti ini:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
Ada peringatan -- jika liborangejuice
menggunakan libapplejuice
, lalu libapplejuice
akan terhubung secara dinamis juga.
Anda harus menautkan liborangejuice
statis bersama dengan libapplejuice
untuk mendapatkan libapplejuice
statis.
Dan jangan lupa simpan -Wl,-Bdynamic
jika tidak, Anda akan menautkan semua yang statis, termasuk libc
(yang bukan merupakan hal yang baik untuk dilakukan).
Ya, saya tahu ini adalah pertanyaan berusia 8 tahun, tetapi saya diberi tahu bahwa menautkan secara statis ke perpustakaan objek bersama adalah mungkin dan ini benar-benar menjadi hit teratas ketika saya mencari informasi lebih lanjut tentangnya.
Untuk benar-benar mendemonstrasikan bahwa menautkan pustaka objek bersama secara statis tidak dimungkinkan dengan ld
(gcc
's linker) -- bukan hanya sekelompok orang yang bersikeras bahwa itu tidak mungkin -- gunakan gcc
berikut perintah:
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(Tentu saja Anda harus mengkompilasi objectname.o
dari sourcename.c
, dan Anda mungkin juga harus membuat perpustakaan objek bersama Anda sendiri. Jika ya, gunakan -Wl,--library-path,.
sehingga ld dapat menemukan pustaka Anda di direktori lokal.)
Kesalahan sebenarnya yang Anda terima adalah:
/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status
Semoga itu bisa membantu.