Rumah > pembangunan bahagian belakang > C++ > Masalah perpustakaan bersama yang unik

Masalah perpustakaan bersama yang unik

Patricia Arquette
Lepaskan: 2025-01-28 14:03:11
asal
388 orang telah melayarinya

Unique Shared Library Problem

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>
Salin selepas log masuk

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>
    Salin selepas log masuk
  • lib.c:

    <code class="language-c">#include "lib.h"
    int add(int a, int b) {
    return a + b;
    }</code>
    Salin selepas log masuk
  • 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>
    Salin selepas log masuk
  • 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>
    Salin selepas log masuk
  • build_main.sh (gcc):

    <code class="language-bash">gcc -std=c11 -L. -l:libm.so main.c -o main</code>
    Salin selepas log masuk
Ini mengakibatkan kesilapan yang sama seperti projek asal saya. Walau bagaimanapun, apabila skrip

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

Kesimpulan: Ketidakserasian pengkompil

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan