OpenMPの場合、自分のコードがそのディレクティブ(#pragma omp ...など)を使用せずにAPIの関数(omp_get_thread_num()など)を使用している場合、
-fopenmpを使用する代わりにlibgomp.aをgccに直接指定しても機能しないのはなぜですか。
gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a -o hello
pdate: libgomp.aへのリンクは機能しないが、libgomp.soへのリンクは機能することがわかりました。 OpenMPは静的にリンクできないということですか?
-fopenmpがライブラリファイルを指定せずにのみ機能する理由
gcc hello.c -fopenmp -o hello
pdate:言い換えると、-fopenmpを使用するときに、libgomp.soへの明示的なリンクが不要なのはなぜですか?
なぜこれもコンパイルするのですか?
gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello
コードにOpenMPディレクティブがある場合、これは無視されますか?
よろしくお願いします!
一般に、ディレクティブと関数は異なるものであることに注意してください。前者は-fopenmp
によって制御され、後者はOpenMPライブラリにリンクすることによって制御されます。
(コメントを組み込むように更新)-fopenmp
および-static
オプションを使用してOpenMPを静的にリンクしてみてください。これは-lgomp -lrt
を意味するため、librt.a
の場所も指定しない限り、次のコマンドは正しくコンパイルされません。
gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a -o hello
(コメントを組み込むように更新)OpenMPライブラリがすでにライブラリパスにあり、システムのダイナミックリンカーがlibgomp.so
に自動的にリンクしているため、次のコマンドは正しくコンパイルされていると思います。
gcc hello.c -fopenmp -o hello
次のコマンドは、OpenMP(libgomp.so
)の共有オブジェクトにリンクしているため、おそらく正しくコンパイルされています。 -static
オプションは使用されていないことに注意してください。
gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello
-fopenmp
オプションを指定しない場合、OpenMPディレクティブは無視されます。