2011-06-15 60 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