Heim > Backend-Entwicklung > C++ > Einzigartiges Problem mit gemeinsamer Bibliothek

Einzigartiges Problem mit gemeinsamer Bibliothek

Patricia Arquette
Freigeben: 2025-01-28 14:03:11
Original
388 Leute haben es durchsucht

Unique Shared Library Problem

Die Herausforderung: Verknüpfen einer gemeinsamen Bibliothek

Ich habe kürzlich auf ein Verknüpfungsproblem gestoßen, als ich eine aus der Quell gebaute Bibliothek in ein lokales C-Projekt integriert habe. Der Linker meldete undefined reference Fehler beim Versuch, mit der gemeinsamen Bibliothek zu verknüpfen. Die Fehlermeldungen, ähnlich den unten gezeigten, zeigten, dass der Linker keine in der Bibliothek definierten Symbole finden konnte:

<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>
Nach dem Login kopieren

Fehlerbehebung Schritte

Erste Fehlerbehebung beinhaltete die Neukompilierung der Bibliothek mehrmals mit verschiedenen Methoden ohne Erfolg. Die Forschung führte mich zu einem Forum, in dem ein ähnliches Problem im Zusammenhang mit 32-Bit-Toolchains im Vergleich zu 64-Bit-Toolchains beschrieben wurde. Während meine Umgebung als 64-Bit bestätigt wurde, veranlasste ich mich, den Compiler selbst zu berücksichtigen.

Die unerwartete Lösung: Schaltkompiler

Schalten

Ich wechselte von GCC zu Klang, und die Zusammenstellung und Verknüpfung funktionierte einwandfrei. Dies war angesichts der offensichtlichen Einfachheit der Lösung und dem Mangel an ähnlichen Problemen in früheren Projekten überraschend.

Ein kontrolliertes Experiment

Um weiter zu untersuchen, habe ich einen einfachen Testfall erstellt: eine gemeinsame Bibliothek (libm.so), die eine mit Clang zusammengestellte add -Funktion implementiert, und ein Treiberprogramm (main.c), das versucht, sie zu verwenden.

  • lib.h:

    <code class="language-c">#pragma once
    int add(int a, int b);</code>
    Nach dem Login kopieren
  • lib.c:

    <code class="language-c">#include "lib.h"
    int add(int a, int b) {
    return a + b;
    }</code>
    Nach dem Login kopieren
  • 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>
    Nach dem Login kopieren
  • build_so.sh (klang):

    <code class="language-bash">clang -std=c11 -c -o lib.o lib.c
    clang -shared -fPIC -o libm.so lib.o</code>
    Nach dem Login kopieren
  • Build_main.sh (GCC):

    <code class="language-bash">gcc -std=c11 -L. -l:libm.so main.c -o main</code>
    Nach dem Login kopieren

Dies führte zu den gleichen undefined reference -Fehlern wie mein ursprüngliches Projekt. Wenn das Skript build_main.sh zur Verwendung von Clang geändert wurde, wurde das Problem behoben. Ein weiteres Experiment kehrte die Compiler -Rollen um (GCC für die Bibliothek, Klang für das Hauptprogramm), und diese Kombination hat korrekt funktioniert.

Schlussfolgerung: Compiler -Inkompatibilität

Die Untersuchung ergab eine offensichtliche Inkompatibilität: Klang-kompilierte gemeinsame Bibliotheken scheinen Probleme zu haben, wenn sie mit GCC verbunden sind, während das umgekehrte Szenario ohne Probleme funktioniert. Dies erklärt wahrscheinlich, warum ich dieses Problem zuvor noch nicht gestoßen habe, da ich normalerweise denselben Compiler für alle Teile eines Projekts verwende. Die Grundursache für diese Inkompatibilität bleibt unklar, zeigt jedoch eine mögliche Fallstrick, wenn Bibliotheken mit verschiedenen Compilern integriert werden. Wenn jemand von einer Problemumgehung weiß, würde ich mich sehr interessieren, es zu hören.

Das obige ist der detaillierte Inhalt vonEinzigartiges Problem mit gemeinsamer Bibliothek. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage