GNU/Linux >> Belajar Linux >  >> Linux

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

Pastikan bahwa file objek di libmxml.a dibangun dengan -fPIC . Perlu untuk membangun perpustakaan bersama. Lihat juga http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

Ini contoh singkatnya

$ cat stat.c 
int five() { return 5; }
$ gcc -c stat.c -fPIC
$ ar crus libstat.a stat.o
$ cat dynamic.c
int ten() { return five() + five(); }
$ gcc -c dynamic.c -fPIC
$ gcc -shared -o libdyn.so dynamic.o -L. -lstat
$ ldd libdyn.so # Just to show static linkage to libstat.a
  linux-vdso.so.1 =>  (0x00007fffca1b8000)
  libc.so.6 => /lib/libc.so.6 (0x00007fc004649000)
  /lib/ld-linux-x86-64.so.2 (0x00007fc004bf7000)
$ cat main.c 
int main() { return ten(); }
$ gcc main.c -L. -ldyn
$ LD_LIBRARY_PATH=. ./a.out 
$ echo $?
10

Menautkan pustaka bersama ke pustaka statis tidak dimungkinkan (kecuali jika Anda benar-benar tahu betul apa yang Anda lakukan). Jangan lakukan itu.

Peringatan pertama adalah dari libtool. Ini memberi tahu Anda, bahwa operasi yang Anda minta akan melakukan hal yang berbeda pada sistem yang berbeda dan beberapa di antaranya mungkin bukan yang Anda inginkan. Seringkali itu hanya akan gagal dalam berbagai cara yang spektakuler, karena kode yang ada di pustaka bersama dan statis perlu dikompilasi dengan flag compiler yang berbeda.

Peringatan kedua adalah dari gcc. Itu memberi tahu Anda bahwa menyediakan pustaka statis saat kompilasi tidak ada gunanya. Itu karena Anda memiliki $(PATH)/libmxml.a di CFLAGS , di mana ia tidak memiliki urusan keberadaan. Faktanya, sebagian besar waktu Anda tidak memiliki $(PATH)/libmxml.a , tetapi -L$(PATH) -lmxml alih-alih. Itu harus tetap masuk LDFLAGS , tetapi gcc tidak akan mengeluh jika ini juga masuk ke baris perintah kompiler.


Menautkan pustaka bersama libgstmatroskademux.la dengan pustaka statis

Ini memperingatkan Anda bahwa jika Anda mis. mencoba membangun ini di Linux 64-bit, kemungkinan akan gagal. Itu karena pada x86_64, semua kode yang ditautkan ke pustaka bersama harus dikompilasi dengan -fPIC flag, dan kode yang ada di .a perpustakaan biasanya tidak.

gcc:.../libmxml.a:file input penaut tidak digunakan karena penautan tidak dilakukan

Ini memperingatkan Anda bahwa Anda memiliki baris perintah palsu. Kemungkinan besar Anda sedang mengkompilasi sesuatu, dan memiliki -c pada baris perintah (yang memberi tahu GCC untuk berhenti setelah mengompilasi sumber, dan tidak melakukan penautan). Karena Anda juga menyediakan libmxml.a pada baris perintah yang sama, GCC menyadari bahwa Anda tidak tahu apa yang Anda lakukan, dan memperingatkan Anda untuk memikirkannya (lebih lanjut).


Linux
  1. Apa trik LD_PRELOAD?

  2. Apa yang dimaksud dengan POSIX?

  3. Apa default GCC menyertakan direktori?

  1. Apa kerugian dari antrian pesan Linux?

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

  3. Untuk apa opsi 'soname' untuk membangun perpustakaan bersama?

  1. Apa arti dari fork() dan grep di Linux?

  2. relokasi R_X86_64_32S terhadap kesalahan penautan

  3. Bagaimana cara mengetahui perpustakaan bersama yang diberikan dibangun dengan simbol debug atau tidak?