c++ & OpenMP : undefined reference to GOMP_loop_dynamic_start
Ich bin stecken, Folgendes problem : zuerst habe ich kompilieren Sie die folgende Datei cancme.cpp :
void funct()
{
int i,j,k,N;
double s;
#pragma omp parallel for default(none) schedule(dynamic,10) private(i,k,s) shared(j,N)
for(i=j+1;i<N;i++) {}
}
durch:
mingw32-g++.exe -O3 -std=c++11 -mavx -fopenmp -c C:\pathtofile\cancme.cpp -o C:\pathtofile\cancme.o
Nächstes Baue ich eine zweite Datei, test.cpp einfach eine Verknüpfung cancme.o mit :
int main()
{
return(0);
}
durch:
mingw32-g++.exe -O3 -std=c++11 -mavx -fopenmp -c C:\pathtofile\test.cpp -o C:\pathtofile\test.o
Beim verknüpfen es mit cancme.o, von :
mingw32-g++.exe -o C:\pathtofile\test.exe C:\pathtofile\test.o -lgomp C:\pathtofile\cancme.o
Bekomme ich folgende Fehlermeldungen :
C:\pathtofile\cancme.o:cancme.cpp:(.text+0x39): undefined reference to `GOMP_loop_dynamic_start'
C:\pathtofile\cancme.o:cancme.cpp:(.text+0x49): undefined reference to `GOMP_loop_dynamic_next'
C:\pathtofile\cancme.o:cancme.cpp:(.text+0x52): undefined reference to `GOMP_loop_end_nowait'
C:\pathtofile\cancme.o:cancme.cpp:(.text+0x92): undefined reference to `GOMP_parallel_start'
C:\pathtofile\cancme.o:cancme.cpp:(.text+0x9f): undefined reference to `GOMP_parallel_end'
Hat jemand eine Idee, was da schief??? Der OpenMP-Bibliothek korrekt verbunden durch die -lgomp
Flagge, aber es ist so wie es war, nicht erkannt.
Hinweis : ich benutze MingW 4.8.1 c++ - compiler unter windows 7 64 bit:
danke
renato
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den GNU linker ist ein single-pass-linker. Es bedeutet, dass es löst nur Symbole, die es gesehen hat, bevor es erreicht hat, die Objekt-Datei definiert das entsprechende symbol. Das bedeutet, dass, wenn der Objekt-Datei
foo.o
bezieht sich Symbole aus der Bibliotheklibbar.a
, dann mit... foo.o -lbar ...
führt erfolgreiche Verknüpfung, da das Undefinierte Referenzen gesehen infoo.o
zufrieden sind, bei der Verarbeitung vonlibbar.a
(solange kein anderes Objekt aufgeführt, nach-lbar
bezieht sich Symbole aus der Bibliothek). Das Gegenteil, d.h.... -lbar foo.o ...
wird nicht funktionieren, da sobald der linker verarbeitet hatlibbar.a
ist, wird es nicht mehr, Suche es beim Versuch zum auflösen der Verweise infoo.o
.Auf Unix-Systemen, dass die Unterstützung von dynamischen link-Bibliotheken (z.B. Linux, FreeBSD, Solaris, etc.), dies ist oft nicht der Fall, da
-lbar
erst nach der dynamischen version der Bibliothek, z.B.libbar.so
, und nur wenn Sie Sie nicht finden würden versuchen, link gegen die statischelibbar.a
. Bei einer Verknüpfung mit den dynamischen Bibliotheken, die Reihenfolge spielt keine Rolle, da die nicht aufgelösten Referenzen werden später behandelt, indem die Laufzeit-link-editor.Unter Windows, Verlinkung gegen dynamic link libraries (DLLs), benötigen Sie die sogenannte import-Bibliotheken werden statisch in die ausführbare Datei. Daher, auch wenn die externen Abhängigkeiten behandelt werden, die von der Laufzeit-linker ist, muss man noch richtig um die statischen Bibliotheken importieren.
libgomp.a
ist eine solche Bibliothek.Beachten Sie, dass dieses Verhalten ist spezifisch für die GNU-linker, der Teil von MinGW. Der Microsoft-linker verhält sich anders: beim auflösen einer Referenz, durchsucht es zunächst die Bibliotheken aufgeführt, nach der Objekt-Datei und dann die Bibliotheken aufgelistet, bevor es.
Du einen Fehler im compile-Befehl:
Wenn Sie möchten, verwenden manche makefile-Generatoren wie
CMake
Sie zum Beispiel nicht alle linking-Fehler.Nicht Durcheinander compiler-Parameter wie folgt:
object_file_1 linker_flag_1 object_file_2
.Richtige Befehl zum kompilieren wäre diese: