Bagaimana cara menautkan fungsi pustaka bersama secara statis di gcc?
Jawaban:
Mengacu pada:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
Anda memerlukan versi statis pustaka untuk menautkannya.
Perpustakaan 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 ditautkan secara statis.
Anda tidak dapat menautkan pustaka bersama secara statis (atau secara dinamis menautkan pustaka statis).
Bendera -static
akan memaksa linker untuk menggunakan pustaka statis (.a), bukan yang dibagikan (.so). Tetapi pustaka statis tidak selalu diinstal secara default, jadi Anda mungkin harus menginstal sendiri pustaka statis tersebut.
Pendekatan lain yang mungkin adalah menggunakan statifier atau Ermine . Kedua alat mengambil sebagai masukan yang dapat dieksekusi yang terhubung secara dinamis dan sebagai keluaran membuat eksekusi mandiri dengan semua pustaka bersama yang disematkan.
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
digunakan libapplejuice
, maka libapplejuice
akan ditautkan secara dinamis juga.
Anda harus menautkan liborangejuice
secara statis bersama dengan libapplejuice
untuk menjadi libapplejuice
statis.
Dan jangan lupa untuk menyimpan -Wl,-Bdynamic
lagi Anda akan berakhir dengan menautkan semua statis, termasuk libc
(yang bukan hal yang baik untuk dilakukan).
gcc -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L.
libB menggunakan libA , ia ditautkan dan ldd
tidak menunjukkan referensi ke libA . Eksekusi berfungsi dengan baik. Diuji dengan g ++ 4.7.3.
Jika Anda memiliki file .a dari pustaka bersama (.so), Anda dapat memasukkannya 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 pustaka statis terkait dan membuat file yang dapat dieksekusi (bernama "main"):
gcc main.o mylibrary.a -o main
Atau dalam satu perintah:
gcc main.c mylibrary.a -o main
Ini juga bisa menjadi jalur absolut atau relatif:
gcc main.c /usr/local/mylibs/mylibrary.a -o main
Ya, saya tahu ini adalah pertanyaan berusia 8 tahun, tetapi saya diberi tahu bahwa adalah mungkin untuk menautkan secara statis ke pustaka objek bersama dan ini benar-benar menjadi yang teratas ketika saya mencari informasi lebih lanjut tentangnya.
Untuk benar-benar mendemonstrasikan bahwa menautkan pustaka objek bersama secara statis tidak dimungkinkan dengan ld
( gcc
linker) - berlawanan dengan hanya sekelompok orang yang bersikeras bahwa itu tidak mungkin - gunakan gcc
perintah berikut :
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 Anda melakukannya, gunakan -Wl,--library-path,.
agar ld dapat menemukan perpustakaan 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 membantu.
Agak terlambat tapi ... Saya menemukan tautan yang saya simpan beberapa tahun yang lalu dan saya pikir itu mungkin berguna untuk kalian:
CDE: Buat aplikasi Linux portabel secara otomatis
http://www.pgbovine.net/cde.html
Jalankan penerusan biner sebagai argumen nama biner yang ingin Anda jadikan portabel, misalnya: nmap
./cde_2011-08-15_64bit nmap
Program akan membaca semua lib yang terhubung ke nmap dan dependensinya dan akan menyimpan semuanya dalam folder bernama cde-package / (di direktori yang sama dengan Anda).
Ingat, untuk meluncurkan program portabel Anda harus menjalankan biner yang terletak di cde-package / nmap.cde
salam Hormat