各位大大好
網路上很多教學範例起手式都是hello world。
有的還會附上在命令列如何編譯。
然而大多數的編譯命令都是應用Linux 的OS環境上,而我用的是windows。
(作業系統要以好用優先,win11 沒有改回前一版的設定開關,不升了。)
針對不同廠商的編譯器 (compiler) 跟不同的作業系統,後面的參數還不是共用的。
微軟的VC是 cl.exe,intel c 是icl .exe。
想到的是把網頁 Linux 的編譯指令 直接複製在windows 上就有相同作用就好了
那就寫個可以轉換參數字串的批次檔
批次檔先檢查環境變數是微軟VC或intel c
再來檢查有沒有支援 多執行緒 / xeon phi or CPU / optimize 等級...
舉例
linux 多執行緒 = -mmic
-> 微軟VC = /openmp
-> intel c = /Qopenmp
寫完目前可用的批次檔,以下的輸出可以正常自用了。
buildmic.sh 第一行是
icpc -O3 -opt-threads-per-core=2 -mmic -no-vec -openmp -vec-report3 bw.cpp gettime.cpp -o bw.out
intel c 轉換成
icl /nologo /O3 /Qopenmp-offload:mic /Qopenmp /Fe:bw.exe *.obj
微軟VC 轉換成
cl /nologo /O2 /openmp /Fe:bw.exe *.obj
之後突然想到我能想到的事,應該也有人想到了。
有沒有什麼關鍵字可以找到前輩分享的編譯指令互轉的內容或程式。
先謝謝了。
以下是icpc.bat 內容。
@ECHO OFF
cls
rem ******************************************************************************
set build_cmd=
set CompilerVendor=
rem ******************************************************************************
set current_path=%path%
set current_path=%current_path:;=" "%
for %%a in ( "%current_path%" ) do (
if exist "%%~a\cl.exe" set CompilerVendor=cl
)
for %%a in ( "%current_path%" ) do (
if exist "%%~a\icl.exe" set CompilerVendor=icl
)
if "%CompilerVendor%" == "" (
echo. C compiler tool not found.
goto:end
)
del *.o *.exe *obj *.pdb > nul 2>&1
set build_cmd=%CompilerVendor% /nologo
for %%a in ( %* ) do (
call:append_build_cmd %%a
)
echo.%0 %*
echo.%build_cmd%
echo.
%build_cmd%
del *.o *obj *.pdb > nul 2>&1
goto:end
rem ******************************************************************************
:append_build_cmd
set append_build_cmd_1=%1
if "%append_build_cmd_1%" == "-openmp" (
if /i "%CompilerVendor%" == "cl" (
set build_cmd=%build_cmd% /openmp
) else (
set build_cmd=%build_cmd% /Qopenmp
)
goto:eof
)
if "%append_build_cmd_1%" == "-mmic" (
if /i "%CompilerVendor%" == "icl" (
set build_cmd=%build_cmd% /Qopenmp-offload:mic
)
goto:eof
)
if exist "%append_build_cmd_1%" (
echo.Build obj file.
%build_cmd% /c %append_build_cmd_1%
echo.
goto:eof
)
rem optimize for maximum speed
if /i "%append_build_cmd_1%" == "-O1" (
set build_cmd=%build_cmd% /O1
goto:eof
)
if /i "%append_build_cmd_1%" == "-O2" (
set build_cmd=%build_cmd% /O2
goto:eof
)
if /i "%append_build_cmd_1%" == "-O3" (
if /i "%CompilerVendor%" == "cl" (
set build_cmd=%build_cmd% /O2
) else (
set build_cmd=%build_cmd% /O3
)
goto:eof
)
if /i "%append_build_cmd_1%" == "-O" (
set last_string=%append_build_cmd_1%
goto:eof
)
if /i "%append_build_cmd_1:~-4,4%" == ".out" (
if /i "%last_string%" == "-O" (
set build_cmd=%build_cmd% /Fe:%append_build_cmd_1:~0,-4%.exe *.obj
goto:eof
)
)
goto:eof
rem ******************************************************************************
:end

X