指定OpenMP到GCC

对于OpenMP,当我的代码使用其API中的函数(例如,omp_get_thread_num())而不使用其指令(例如#pragma omp …)时,

  1. 为什么直接将libgomp.a指定为gcc而不是使用-fopenmp不起作用,例如

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

    更新:我刚刚发现链接到libgomp.a不起作用,但链接到libgomp.so工作。 这是否意味着OpenMP不能静态链接?

  2. 为什么-fopenmp只能在不指定库文件的情况下工作

     gcc hello.c -fopenmp -o hello 

    更新:换句话说,当使用-fopenmp时,为什么不需要显式链接到libgomp.so?

  3. 为什么这也编译:

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

    如果有的话,这会忽略代码中的OpenMP指令吗?

感谢致敬!

一般来说,请记住指令和function是不同的东西; 前者由-fopenmp控制,后者通过链接到OpenMP库来控制。

  1. (已更新以合并注释 )尝试使用-fopenmp-static选项静态链接OpenMP。 因为这意味着-lgomp -lrt ,除非您还指定了librt.a的位置,否则以下命令将无法正确编译。

     gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a -o hello 
  2. 更新以包含注释 )我认为以下命令正在正确编译,因为OpenMP库已经在您的库路径中,并且您的系统的动态链接器自动与libgomp.so链接。

     gcc hello.c -fopenmp -o hello 
  3. 以下命令可能正在正确编译,因为它链接到OpenMP的共享对象( libgomp.so )。 请注意, 使用-static选项。

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

    如果未指定-fopenmp选项,则应忽略OpenMP指令。