指定OpenMP到GCC

Tim*_*Tim 24 c gcc openmp

对于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
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    gcc hello.c -fopenmp -o hello
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. 为什么这也编译:

    gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello
    
    Run Code Online (Sandbox Code Playgroud)

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

感谢致敬!

Chr*_*ick 25

一般来说,请记住指令和功能是不同的东西; 前者受控制,-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
    
    Run Code Online (Sandbox Code Playgroud)
  2. (更新以合并注释)我想以下命令正在正确编译,因为OpenMP库已经在您的库路径中,并且您的系统的动态链接器正在自动链接libgomp.so.

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

    gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello
    
    Run Code Online (Sandbox Code Playgroud)

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

  • (1)您可以使用"-fopenmp -static"静态链接OpenMP.你会发现,当指定它时,它使用"-lgomp -lrt".(2)如果系统支持动态链接器,则使用它,当您指定-fopenmp时,它将与libgomp.so链接. (3认同)