Frage

Ich habe folgendes Programm:

~/test> cat test.cc
int main()
{
  int i = 3;
  int j = __sync_add_and_fetch(&i, 1);
  return 0;
}

Ich bin die Erstellung dieses Programms GCC 4.2.2 auf Linux auf einem Multi-CPU 64-Bit-Intel-Rechner ausgeführt wird:

~/test> uname --all
Linux doom 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:56:44 EST 2007 x86_64 x86_64 x86_64 GNU/Linux

Wenn ich das Programm in 64-Bit-Modus kompilieren, kompiliert und verknüpft fein:

~/test> /share/tools/gcc-4.2.2/bin/g++ test.cc
~/test>

Wenn ich es in 32-Bit-Modus kompilieren, bekomme ich folgende Fehlermeldung:

~/test> /share/tools/gcc-4.2.2/bin/g++ -m32 test.cc
/tmp/ccEVHGkB.o(.text+0x27): In function `main':
: undefined reference to `__sync_add_and_fetch_4'
collect2: ld returned 1 exit status
~/test>

Obwohl ich nie wirklich laufe auf einem 32-Bit-Prozessor, ich brauche ein 32-Bit-Programm, so kann ich mit einigen 32-Bit-Bibliotheken verknüpfen.

Meine 2 Fragen sind:

  1. Warum erhalte ich einen Link Fehler, wenn ich in 32-Bit-Modus kompilieren?

  2. Gibt es eine Möglichkeit, das Programm zu kompilieren und Link zu bekommen, während immer noch mit einer 32-Bit-Bibliothek verknüpfen zu können?

War es hilfreich?

Lösung

Von der GCC Seite auf Atomic builtins :

  

Nicht alle Operationen werden unterstützt durch   alle Zielprozessoren. Wenn eine bestimmte   Vorgang kann nicht auf die umgesetzt werden   Zielprozessor, wird eine Warnung sein   erzeugt, und ein Anruf ein externes   Funktion wird generiert. Das   externe Funktion tragen die gleiche   Namen wie das Builtin, mit einem   zusätzliche Suffix `_n‘, wobei n die ist   Größe des Datentyps.

Geht man von der Compiler-Ausgabe, die __sync_add_and_fetch_4 bezieht, ist das, was passiert. Aus irgendeinem Grund Erzeugung GCC nicht die externe Funktion richtig.

Dies ist wahrscheinlich, warum Sie nur einen Fehler in dem 32-Bit-Modus bekommen - wenn für 64-Bit-Modus kompiliert, es enger für Ihren Prozessor kompiliert. Wenn für 32-Bit kompiliert, kann es durchaus einen generischen Bogen (i386, zum Beispiel) verwenden, die nativ nicht diese Funktionen unterstützen. Versuchen Sie, eine bestimmte Architektur für Ihre Chip-Familie spezifiziert (Xeon, Core 2, etc.) über -mcpu und sehen, ob das funktioniert.

Wenn nicht, werden Sie herausfinden, warum GCC umfasst nicht die entsprechende Funktion, dass es zu erzeugen werden sollte.

Andere Tipps

Die Antwort von Dan Udey war in der Nähe, nahe genug, in der Tat, mir zu erlauben, die wirkliche Lösung zu finden.

Nach der Manpage „-mcpu“ ist ein veraltetes Synonym für „-mtune“ und nur bedeutet „Optimierung für eine bestimmte CPU (aber immer noch älteren CPUs läuft auf, wenn auch weniger optimal)“. Ich versuchte dies und es das Problem nicht lösen.

Doch „-march =“ bedeutet „Code für eine bestimmte CPU erzeugen (und nicht älteren CPUs läuft auf)“. Als ich das versuchte, löste es das Problem:. Eine CPU von i486 oder besser Angabe des Verbindungsfehlers losgeworden

~/test> /share/tools/gcc-4.2.2/bin/g++ -m32  test.cc
/tmp/ccYnYLj6.o(.text+0x27): In function `main':
: undefined reference to `__sync_add_and_fetch_4'
collect2: ld returned 1 exit status

~/test> /share/tools/gcc-4.2.2/bin/g++ -m32 -march=i386 test.cc
/tmp/ccOr3ww8.o(.text+0x22): In function `main':
: undefined reference to `__sync_add_and_fetch_4'
collect2: ld returned 1 exit status

~/test> /share/tools/gcc-4.2.2/bin/g++ -m32 -march=i486 test.cc

~/test> /share/tools/gcc-4.2.2/bin/g++ -m32 -march=pentium test.cc
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top