2012-11-16 14 views
7

Sto provando a compilare un programma utilizzando un GCC-4.7.1 auto-compilato su Mac OS 10.8.2. Il programma utilizza openMP e la compilazione ha esito positivo; tuttavia, quando si tenta di eseguire il programma, il linker dinamico lamenta conManca ___emutls_get_address con gcc-4.7 e 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 

Questo problema è costantemente presente in ogni programma compilato con -fopenmp, tra cui il MWE

#include <stdio.h> 

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

nota che la soluzione suggerita in What is the "___emutls_get_address" symbol?, ovvero l'aggiunta di -lgcc_eh nella fase di collegamento, non funziona (ho ancora lo stesso messaggio di errore dyld).

+0

Strano, ho compilato di recente GCC 4.7.1 su OS X 10.8.2 in base a [questa guida] (http://solarianprogrammer.com/2012/07/21/compiling-gcc-4-7-1- mac-osx-lion /) e il supporto OpenMP funziona perfettamente. –

+0

@HristoIliev Verificherò di nuovo come l'ho compilato e provo a ricompilare. Speriamo che il problema scompaia ... –

+0

Una domanda e una risposta simili sono state pubblicate lì: http://stackoverflow.com/questions/7885246/what-is-the-emutls-get-address-symbol – FabienRohrer

risposta

1

Ho avuto esattamente lo stesso problema. Nel mio caso è stato causato dal collegamento a una libreria (non ricordo quale) di una versione precedente di gcc installata da XCode, che era in/usr/lib. Quando l'ho corretto per collegarmi alla nuova libreria gcc della versione che ho usato per la compilazione (in/usr/local), questo errore è stato corretto.

Quindi, basta controllare il vostro eseguibile costruito e tutte le librerie che è collegato con l'utilizzo di

otool -L EXECUTABLE_OR_DYLIB 

E se trovate qualcosa collegato con una libreria di un gcc più vecchia, sistemare le cose.