对于OpenMP,当我的代码使用其API中的函数(例如,omp_get_thread_num())而不使用其指令(例如#pragma omp ...)时,
为什么直接指定libgomp.a gcc而不是使用-fopenmp 不起作用,例如
gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a -o hello
更新:我刚刚发现链接到libgomp.a不起作用,但链接到libgomp.so有效。这是否意味着OpenMP不能静态链接?
为什么-fopenmp只能在没有的情况下工作 指定库文件
gcc hello.c -fopenmp -o hello
更新:换句话说,使用-fopenmp时,为什么不需要显式链接到libgomp.so?
为什么还要编译:
gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello
这会忽略OpenMP指令吗? 在代码中是否有?
谢谢和问候!
答案 0 :(得分:25)
一般来说,请记住指令和功能是不同的东西;前者由-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库已经在您的库路径中,并且您的系统的动态链接器正在自动链接{{1 }}
libgomp.so
以下命令可能正在正确编译,因为它链接到OpenMP的共享对象(gcc hello.c -fopenmp -o hello
)。请注意,libgomp.so
选项未使用。
-static
如果未指定gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello
选项,则应忽略OpenMP指令。