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>
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
SchaltenIch 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>
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 (klang):
<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>
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!