Geben Sie OpenMP für GCC an

Lesezeit: 3 Minuten

Benutzer-Avatar
Tim

Wenn mein Code für OpenMP die Funktionen in seiner API verwendet (z. B. omp_get_thread_num()), ohne seine Direktiven (z. B. #pragma omp …) zu verwenden,

  1. warum die direkte Angabe von libgomp.a zu gcc anstelle von -fopenmp nicht funktioniert, wie z

    gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a  -o hello
    

    Aktualisieren: Ich habe gerade festgestellt, dass das Verlinken auf libgomp.a nicht funktioniert, aber das Verlinken auf libgomp.so funktioniert. Bedeutet das, dass OpenMP nicht statisch gelinkt werden kann?

  2. Warum -fopenmp nur ohne Angabe der Bibliotheksdateien funktioniert

    gcc hello.c -fopenmp -o hello
    

    Aktualisieren: Mit anderen Worten, warum ist bei Verwendung von -fopenmp keine explizite Verknüpfung mit libgomp.so erforderlich?

  3. Warum kompiliert dies auch:

    gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello
    

    Werden OpenMP-Anweisungen im Code ignoriert, falls vorhanden?

Danke und Grüße!

  • Aus der GCC-Dokumentation: Das Flag -fopenmp sorgt auch für die automatische Verknüpfung der OpenMP-Laufzeitbibliothek. Siehe hier: gcc.gnu.org/onlinedocs/libgomp/…

    Benutzer1436916

    26. Mai 2013 um 15:17 Uhr


Benutzer-Avatar
Chris Friedrich

Denken Sie im Allgemeinen daran, dass die Direktiven und die Funktionen verschiedene Dinge sind; Erstere werden von kontrolliert -fopenmp und letztere werden durch die Verknüpfung mit der OpenMP-Bibliothek gesteuert.

  1. (Aktualisiert, um Kommentare einzufügen) Versuchen Sie es mit der -fopenmp und -static Optionen zum statischen Linken von OpenMP. Denn dies impliziert -lgomp -lrtwird der folgende Befehl nicht korrekt kompiliert, es sei denn, Sie geben auch den Speicherort von an librt.a.

    gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a  -o hello
    
  2. (Aktualisiert, um Kommentare einzufügen) Ich stelle mir vor, dass der folgende Befehl korrekt kompiliert wird, da sich die OpenMP-Bibliothek bereits in Ihrem Bibliothekspfad befindet und der dynamische Linker Ihres Systems automatisch verknüpft libgomp.so.

    gcc hello.c -fopenmp -o hello
    
  3. Der folgende Befehl wird wahrscheinlich ordnungsgemäß kompiliert, da er mit dem gemeinsam genutzten Objekt für OpenMP (libgomp.so). Notiere dass der -static Option ist nicht Gebraucht.

    gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello
    

    Wenn Sie die nicht angeben -fopenmp Option sollten OpenMP-Anweisungen ignoriert werden.

  • Vielen Dank! Ich betrachte den Code mit API und ohne Anweisungen. (1) Ich habe gerade festgestellt, dass das Verlinken auf libgomp.a nicht funktioniert, aber das Verlinken auf libgomp.so funktioniert. Bedeutet das, dass OpenMP nicht statisch gelinkt werden kann? (2) Warum ist bei Verwendung von -fopenmp keine explizite Verknüpfung mit libgomp.so erforderlich?

    – Tim

    15. Juni 2011 um 17:16 Uhr

  • (1) Sie können OpenMP statisch mit “-fopenmp -static” verknüpfen. Sie werden feststellen, dass, wenn dies angegeben ist, “-lgomp -lrt” verwendet wird. (2) Wenn das System den dynamischen Linker unterstützt, wird er verwendet, und wenn Sie -fopenmp angeben, wird er mit libgomp.so verknüpft.

    – ejd

    15. Juni 2011 um 19:33 Uhr

  • Es scheint, dass sowohl der Compiler als auch der Linker die -fopenmp Flagge.

    – Royi

    21. Februar 2018 um 0:34 Uhr

  • @ejd Hallo, ich würde gerne wissen, wie Leute “-fopenmp -static”-Links zu openmp- und rt-Bibliotheken kennen können. Ich tue man gcc und suchen -fopenmp -static aber kein Ergebnis gefunden, und suchen -fopenmp Ergebnis nicht erhalten rt Bibliothek.

    – ChrisZZ

    13. Januar um 15:08 Uhr

1373360cookie-checkGeben Sie OpenMP für GCC an

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy