[英]LLVM / Clang 8 Compilation of OpenMP Code in Windows
我在 Windows 下使用Clang (LLVM) 8 的 Windows 版本。
我正在編譯使用OpenMP的代碼。
在 Clang 的lib
文件夾下有 2 個與 OpenMP 相關的文件:
libomp.lib
。libiomp5md.dll
。我的問題是:
-Xclang -fopenmp
。 在 GCC 中,ICC 使用標志告訴編譯器自動鏈接 OpenMP 庫。 Clang 呢? 它是自動執行還是我必須手動鏈接libomp.lib
? 有沒有辦法觸發自動鏈接到 OpenMP 庫?clang
驅動程序進行編譯和鏈接,然后-fopenmp
將像在GCC
中一樣工作。libomp.lib
(定義為鏈接器的庫)時,output exe
需要libomp.dll
,而提供的 OpenMP 動態庫是libiomp5md.dll
。 這是一個錯誤還是因為我手動鏈接?libomp.dll
在bin
文件夾中提供,而不是在lib
文件夾中提供。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.lib
或libiomp5md.lib
,它們將在運行時鏈接到同名的 DLL,即分別libomp.dll
或libiomp5md.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.