簡體   English   中英

LLVM / Clang 8 Windows中OpenMP代碼編譯

[英]LLVM / Clang 8 Compilation of OpenMP Code in Windows

我在 Windows 下使用Clang (LLVM) 8 的 Windows 版本。
我正在編譯使用OpenMP的代碼。

在 Clang 的lib文件夾下有 2 個與 OpenMP 相關的文件:

  1. libomp.lib
  2. libiomp5md.dll

我的問題是:

  1. 當我編譯代碼時,我為編譯器使用標志-Xclang -fopenmp 在 GCC 中,ICC 使用標志告訴編譯器自動鏈接 OpenMP 庫。 Clang 呢? 它是自動執行還是我必須手動鏈接libomp.lib 有沒有辦法觸發自動鏈接到 OpenMP 庫?
    回答邁克爾克萊姆在下面的回答中對此進行了回答——使用clang驅動程序進行編譯和鏈接,然后-fopenmp將像在GCC中一樣工作。
  2. 當我手動鏈接libomp.lib (定義為鏈接器的庫)時,output exe需要libomp.dll ,而提供的 OpenMP 動態庫是libiomp5md.dll 這是一個錯誤還是因為我手動鏈接?
    回答libomp.dllbin文件夾中提供,而不是在lib文件夾中提供。
  3. 在 Windows 下的 Clang 中使用 OpenMP 的正確方法是什么? clang-cl驅動程序不適用於/openmp-openmp作為 MSVC 的cl編譯器。
    回答:目前可以使用clang -fopenmp...clang-cl -Xclang -fopenmp...clang-cl /clang:-fopenmp... (相當於-Xclang -fopenmp )來完成。

評論
在 Windows 上,我使用 Windows Driver of Clang using clang-cl

進一步說明 OpenMP 庫的實際含義,以及如何使用clang-cl在 Windows 上使用它們

libomp.dll 和 libiomp5md.dll 是相同的文件!

為 Windows 編譯時,您鏈接到libomp.liblibiomp5md.lib ,它們將在運行時鏈接到同名的 DLL,即分別libomp.dlllibiomp5md.dll

如果您加載 2 個使用“不同名稱 DLL”的文件,解釋器將崩潰並給您一個令人討厭的錯誤,例如: OMP:錯誤 #15:初始化 libiomp5md.dll,但發現 libomp.dll 已經初始化。

為什么? 因為程序不知道它們是相同的 DLL,它們具有不同的名稱,所以它假定它們是不同的。 它崩潰了。 僅出於這個原因,您可以選擇交換您在程序中鏈接到的 OpenMP DLL。

如果您的程序沒有崩潰並給您一個錯誤,您可以繼續使用相同的 OpenMP 鏈接。 否則,要消除錯誤,請鏈接到已經由另一個程序加載的錯誤。

如果使用clang-cl.exe ,它是 MSVC cl.exe的“插入式”Clang 替代品,您應該傳遞一個編譯器參數,例如-Xclang -fopenmp ,它將把參數轉換為“Clang 語言”。 不要忘記仍然將您選擇的 OpenMP LIB 傳遞給 linker,因為在 Windows 上,它不會是自動的。

這就是我在 Windows 上盡可能簡要地了解 OpenMP 鏈接的全部內容。

要在 Windows 上使用 clang 編譯和鏈接 OpenMP 代碼,您必須將-fopenmp傳遞給編譯器和鏈接器:

clang -fopenmp -o bla.obj -c bla.c
clang -fopenmp -o bla.exe bla.obj

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM