2011-06-15 64 views
21

对于OpenMP,当我的代码在其API中使用的功能(例如,omp_get_thread_num()),而无需使用其指令(例如那些的#pragma OMP ...),指定的OpenMP到GCC

  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指令 的代码,如果有任何?

感谢和问候!

+0

从GCC文档:-fopenmp标志还安排了OpenMP运行时库的自动链接。请参阅:http://gcc.gnu.org/onlinedocs/libgomp/Enabling-OpenMP。html #Enabling-OpenMP – 465544 2013-05-26 15:17:20

回答

22

一般来说,请记住,指令和函数是不同的东西;前者由-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)共享对象。请注意0​​选项是而不是使用。

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

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

+0

谢谢!我正在考虑API和没有指令的代码。 (1)我刚刚发现,链接到libgomp.a不起作用,但链接到libgomp.so的作品。这是否意味着OpenMP不能静态链接? (2)使用-fopenmp时,为什么不需要显式链接到libgomp.so? – Tim 2011-06-15 17:16:09

+3

(1)您可以使用“-fopenmp -static”静态链接OpenMP。你会发现,当它被指定时,它使用“-lgomp -lrt”。 (2)如果系统支持动态链接器,那么它将被使用,当你指定-fopenmp时,它将与libgomp.so链接。 – ejd 2011-06-15 19:33:29

+0

看起来编译器和链接器都需要'-fopenmp'标志。 – Royi 2018-02-21 00:34:44