undefined reference to `__sync_val_compare_and_swap_4' error at compilation, using gcc 4.1.1 und 4.2.0 für die Sparc-v8-Ziel
Mit crosstool scripts, die ich aufgebaut habe, unter Cygwin die folgenden Compiler gcc-4.1.1 und 4.2.0 20061024 (prerelease) für die Sparc-Architektur:
$ ./sparc-unknown-linux-gnu-gcc -v
Using built-in specs.
Target: sparc-unknown-linux-gnu
Configured with: /crosstool-0.43/build/sparc-unknown-linux-gnu/gcc-4.1.1-glibc-2.3.6/gcc-4.1.1/configure --target=sparc-unknown-linux-gnu --host=i686-host_pc-cygwin --prefix=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu --with-headers=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-gnu/include --with-local-prefix=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-gnu --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.1.1
und
$ ./sparc-unknown-linux-gnu-gcc -v
Using built-in specs.
Target: sparc-unknown-linux-gnu
Configured with: /crosstool-0.43/build/sparc-unknown-linux-gnu/gcc-4.2-20061024- glibc-2.3.6/gcc-4.2-20061024/configure --target=sparc-unknown-linux-gnu --host=i 686-host_pc-cygwin --prefix=/opt/crosstool/gcc-4.2-20061024-glibc-2.3.6/sparc-un known-linux-gnu --with-headers=/opt/crosstool/gcc-4.2-20061024-glibc-2.3.6/sparc -unknown-linux-gnu/sparc-unknown-linux-gnu/include --with-local-prefix=/opt/cros stool/gcc-4.2-20061024-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-g nu --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atex it --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.2.0 20061024 (prerelease)
Ist es notwendig für mich, dass ich in meinen Programmen __sync_val_compare_and_swap
Funktion in Bezug auf die Atomic-Gelieferten, welches mit 4.1.* version von gcc.
Ich versuche zu kompilieren einfachen C-code:
long cmpxchg( long* value, long comp_val, long new_val )
{
return __sync_val_compare_and_swap( value, comp_val, new_val );
}
int main()
{
return 0;
}
Aber ich habe die folgenden Fehler: (auf beide Compiler):
$ ./sparc-unknown-linux-gnu-gcc test_cas.c -o test_cas
/tmp/ccREXHsP.o: In function `cmpxchg':
test_cas.c:(.text+0x24): undefined reference to `__sync_val_compare_and_swap_4'
collect2: ld returned 1 exit status
Was ist das problem? Kann sein das ich falsch gebaut Compiler? Kann Sparc-Architektur (SPARC v8) nicht unterstützt dieses feature? Ich habe versucht zu kompilieren, meine anderen Programme - alles gute (kompiliert und ausgeführt).
InformationsquelleAutor G-71 | 2012-02-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie hier beschrieben: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html
__sync_val_compare_and_swap
auf einige Ziele führt einen Aufruf der Funktion (wobei die direkte code-Generierung ist nicht verfügbar oder noch nicht implementiert). Das passiert in deinem Fall. Vorausgesetzt, dass sich ist nicht ein problem für Sie, Sie müssen dann den link in die Bibliothek, definiert__sync_val_compare_and_swap_4
und Freunde, ich nehme an, das ist libgcc_s (also hinzufügen-lgcc_s
zu Ihrer link-Zeile).Sie haben, um library-link nachdem - Ausgabe :
./sparc-unknown-linux-gnu-gcc test_cas.c -o test_cas -lgcc_s
🙁 Es gibt die gleiche Fehlermeldung
Wie zum ausführen von
nm
oderobjdump
auf alle Bibliotheken in die Kreuze ist/usr/lib
und grepping für diese Funktion?Es ist möglich, diese Dateien sind linker-Skripts oder etwas anstelle des tatsächlichen shared libraries. libgcc_s.so sollten einbezogen werden, mit gcc, und ist unwahrscheinlich, dass in /lib oder /usr/lib (statt in /usr/lib/gcc/[target]/[version]/, oder ähnliches). Stellen Sie sicher, dass libgcc_s.so gibt; manchmal Distributionen miss erstellen einen symbolischen Link auf die eigentliche Bibliothek (libgcc_s.so.1, möglicherweise). Und natürlich überprüfen .ein neben .so; es kann nur als statische Bibliothek.
InformationsquelleAutor John Zwinck
Es sieht aus wie es eine Verwandte gcc-bug:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40134
Vielleicht versuchen Sie einen neueren gcc?
InformationsquelleAutor zmccord
Stieß ich auf ein ähnliches problem beim kompilieren von NodeJS(basierend auf den V8-Motor) auf ARMv5-Plattform.
Im Grunde genommen, ist Ihr GCC nicht diese build-in-Funktionen, entweder weil Sie eine alte version, oder sind diese Funktionen nicht implementiert, die auf Ihrer Plattform noch,so dass die "-lgcc_s" kann auch nicht helfen.
Nachdem Google seit Stunden, ich fand diese blog-Seite( http://vincesoft.blogspot.fr/2012/04/how-to-solve-undefined-reference-to.html ), die erklären, die Ursache ziemlich klar und gab eine Lösung:
Schnappen Sie sich den source-code Ihrer Plattform diese Funktionen von GCC-code ein, bauen den code in eine Bibliothek, installieren Sie es, und dann verknüpfen Sie Ihre Anwendungen mit dieser Bibliothek.
Habe ich nicht Folgen Sie den genauen Anweisungen beschrieben in diesem blog, aber die Idee ist die gleiche, und es funktioniert.
Hoffe, es hilft.
InformationsquelleAutor Jerry Tian
auf Android war ich in der Lage, das Problem zu lösen mit den folgenden flags
LOCAL_CFLAGS += -O3 -fopenmp
LOCAL_LDFLAGS += -O3 -fopenmp -grenzüberschreitenden Zweckverbandes -latomic -lgomp
InformationsquelleAutor Karthik Poduval
Für mich, die oben genannten Ausfall bedeutete "Sie sind mit einem gcc/mingw-cross-compiler, so -march=native, funktioniert nicht" (denke ich). Sehen https://stackoverflow.com/a/24213278/32453 (grundsätzlich kann man umgehen, indem man manuell angeben der-march Einstellung).
InformationsquelleAutor rogerdpack