Cabaran: Menghubungkan perpustakaan bersama
Saya baru-baru ini menghadapi isu menghubungkan sambil mengintegrasikan perpustakaan sumber yang dibina ke dalam projek C tempatan. Penyambung melaporkan kesilapan ketika cuba menghubungkan ke perpustakaan yang dikongsi. Mesej ralat, sama seperti yang ditunjukkan di bawah, menunjukkan bahawa penghubung tidak dapat mencari simbol yang ditakrifkan dalam perpustakaan: undefined reference
<code>/bin/ld: /tmp/ccHb7mJ8.o: in function `SDL_main': main.c:(.text+0x3c): undefined reference to `SDL_EnterAppMainCallbacks' ... (other undefined references) ... collect2: error: ld returned 1 exit status make: *** [Makefile:7: all] Error 1</code>
Langkah Penyelesaian Masalah
Penyelesaian masalah awal melibatkan pemulihan semula perpustakaan beberapa kali menggunakan pelbagai kaedah, semuanya tanpa kejayaan. Penyelidikan membawa saya ke jawatan forum yang menggambarkan masalah yang sama yang berkaitan dengan 32-bit berbanding 64-bit toolchains. Walaupun persekitaran saya disahkan sebagai 64-bit, ini mendorong saya untuk mempertimbangkan pengkompil itu sendiri.
Penyelesaian yang tidak dijangka: pengkompil menukar
Saya beralih dari GCC ke Clang, dan penyusunan dan menghubungkan bekerja dengan sempurna. Ini mengejutkan, memandangkan kesederhanaan penyelesaian dan kekurangan masalah yang sama dalam projek -projek yang lalu.
Eksperimen terkawal
untuk menyiasat selanjutnya, saya membuat kes ujian mudah: perpustakaan yang dikongsi () melaksanakan fungsi libm.so
, disusun dengan clang, dan program pemandu (add
) yang cuba menggunakannya. main.c
lib.h:
<code class="language-c">#pragma once int add(int a, int b);</code>
lib.c:
<code class="language-c">#include "lib.h" int add(int a, int b) { return a + b; }</code>
main.c:
<code class="language-c">#include "lib.h" #include <stdio.h> int main () { printf("4+3=%d\n", add(4, 3)); return 0; }</code>
build_so.sh (clang):
<code class="language-bash">clang -std=c11 -c -o lib.o lib.c clang -shared -fPIC -o libm.so lib.o</code>
build_main.sh (gcc):
<code class="language-bash">gcc -std=c11 -L. -l:libm.so main.c -o main</code>
diubahsuai untuk menggunakan Clang, masalah itu diselesaikan. Percubaan selanjutnya membalikkan peranan pengkompil (GCC untuk perpustakaan, Clang untuk program utama), dan gabungan ini berfungsi dengan betul. undefined reference
build_main.sh
Penyiasatan menunjukkan ketidakcocokan yang jelas: Perpustakaan bersama yang dikongsi bersama Clang seolah-olah mempunyai masalah apabila dikaitkan dengan GCC, manakala senario terbalik berfungsi tanpa masalah. Ini mungkin menjelaskan mengapa saya tidak menghadapi masalah ini sebelum ini, kerana saya biasanya menggunakan pengkompil yang sama untuk semua bahagian projek. Punca akar ketidakserasian ini masih tidak jelas, tetapi ia menyoroti perangkap yang berpotensi apabila mengintegrasikan perpustakaan yang dibina dengan penyusun yang berbeza. Sekiranya ada yang tahu tentang penyelesaian, saya sangat berminat untuk mendengarnya.
Atas ialah kandungan terperinci Masalah perpustakaan bersama yang unik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!