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).