2012-11-16 17 views
7

Ich versuche, ein Programm mit einem selbst kompilierten GCC-4.7.1 auf Mac OS 10.8.2 zu kompilieren. Das Programm verwendet openMP und die Kompilierung ist erfolgreich. aber wenn ich versuche, das Programm auszuführen, der dynamische Linker klagt mitFehlende ___emutls_get_address mit gcc-4.7 und openMP

dyld: lazy symbol binding failed: Symbol not found: ___emutls_get_address 
    Referenced from: /usr/local/gcc-4.7.1/lib/libgomp.1.dylib 
    Expected in: /usr/lib/libSystem.B.dylib 

dyld: Symbol not found: ___emutls_get_address 
    Referenced from: /usr/local/gcc-4.7.1/lib/libgomp.1.dylib 
    Expected in: /usr/lib/libSystem.B.dylib 

Dieses Problem ist ständig präsent in jedem Programm mit -fopenmp zusammengestellt, einschließlich der MWE

#include <stdio.h> 

int main() { 
    #pragma omp parallel 
    printf("Hallo!\n"); 
    return 0; 
} 

Beachten Sie, dass die vorgeschlagene Lösung in What is the "___emutls_get_address" symbol?, nämlich Hinzufügen von -lgcc_eh in der Verknüpfungsphase, funktioniert nicht (ich bekomme immer noch die gleiche Fehlermeldung).

+0

Komisch, ich habe kürzlich GCC 4.7.1 auf OS X 10.8.2 nach [dieser Anleitung] zusammengestellt (http://solarianprogrammer.com/2012/07/21/compiling-gcc-4-7-1- mac-osx-lion /) und die OpenMP-Unterstützung funktioniert einwandfrei. –

+0

@HristoIliev Ich überprüfe noch einmal, wie ich es kompiliert habe und versuche es neu zu kompilieren. Hoffentlich verschwindet das Problem ... –

+0

Eine ähnliche Frage und Antwort sind dort geschrieben worden: http://StackOverflow.com/Questions/7885246/what-is-the-emutls-get-address-symbol – FabienRohrer

Antwort

1

Ich hatte genau das gleiche Problem. In meinem Fall wurde es durch das Verknüpfen mit einer Bibliothek (ich erinnere mich nicht daran) einer älteren Version von gcc, installiert von XCode, die in/usr/lib war, verursacht. Als ich es korrigierte, um mit der neueren gcc-Bibliothek der Version, die ich zum Kompilieren verwendete (in/usr/local) zu verlinken, wurde dieser Fehler behoben.

So überprüfen Sie einfach Ihre gebaut ausführbare Datei und alle Bibliotheken ist es bei der Verwendung von

otool -L EXECUTABLE_OR_DYLIB 

verknüpft Und wenn Sie etwas mit einer Bibliothek von einer älteren gcc verbunden finden, beheben, dass.