For OpenMP, when my code is using the functions in its API (for example, omp_get_thread_num()) without using its directives (such as those #pragma omp ...),
why directly specifying libgomp.a to gcc instead of using -fopenmp doesn't work, such as
gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a -o hello
Update: I just found that linking to libgomp.a does not work, but linking to libgomp.so works. Does it mean OpenMP can not be static linked?
Why -fopenmp only works without specifying the library files
gcc hello.c -fopenmp -o hello
Update: In other words, when using -fopenmp, why explicit linking to libgomp.so is not required?
Why does this also compile:
gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello
Will this ignore OpenMP directives in the code if there is any?
Thanks and regards!
In general, keep in mind that the directives and the functions are different things; the former are controlled by -fopenmp
and the latter are controlled by linking to the OpenMP library.
(Updated to incorporate comments) Try using the -fopenmp
and -static
options to statically link OpenMP. Because this implies -lgomp -lrt
, the following command won't compile correctly unless you also specify the location of librt.a
.
gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a -o hello
(Updated to incorporate comments) I imagine that the following command is compiling correctly because the OpenMP library is already in your library path and your system's dynamic linker is automatically linking with libgomp.so
.
gcc hello.c -fopenmp -o hello
The following command is probably compiling properly because it is linking to the shared object for OpenMP (libgomp.so
). Note that the -static
option is not used.
gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello
If you don't specify the -fopenmp
option, OpenMP directives should be ignored.