GNU/Linux >> Belajar Linux >  >> Linux

Tautan statis fungsi perpustakaan bersama di gcc

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.


Linux
  1. Linux - Pemantauan Seluruh Sistem Panggilan Ke Fungsi Perpustakaan?

  2. Pustaka Libsdl Bersama Gagal Dibuka?

  3. Cara menautkan program yang kompleks secara statis

  1. memuat pustaka statis secara dinamis?

  2. Bagaimana cara membuat versi perpustakaan bersama di Linux?

  3. Apa arti dari Peringatan:Menautkan pustaka bersama dengan pustaka statis tidak portabel?

  1. Pengantar Pustaka Bersama Linux (Cara Membuat Pustaka Bersama)

  2. Perbedaan antara objek bersama (.so), pustaka statis (.a), dan DLL (.so)?

  3. Bagaimana pustaka bersama (.so) memanggil fungsi yang diimplementasikan dalam program pemuatannya?