2018 年除了在 https://github.com/mdecourse/cd2018/issues/15 中記錄如何自製 Windows 10 64 位元系統中的可攜式 3.5.0 rev3 V-rep 外, 還嘗試自行利用 MSYS2 編譯 V-rep, 當時使用的可攜系統為 kmol2018_for_compiling_vrep.zip, 而所完成的結果為 3.4.0 rev1 serialization version 20 的 vrep_kmol.7z.
進入 2019 年, https://github.com/CoppeliaRobotics/v_rep/releases 已經釋出 3.6.0 版, 現在 KMOLab 希望探究, 相同的流程是否能夠完成最新版本 V-rep 的編譯.
當然, 在 Windows 64 位元系統中, 自行編譯 V-rep 的目的, 也是希望透過對於原始碼的研究過程中, 進一步了解 V-rep 相關模組配置的細節, 設法將此一系統的最大功能發揮出來.
首先, 看看 V-rep 3.6.0 相對於 3.4.0, 功能有哪些差異? 從 https://github.com/CoppeliaRobotics/v_rep/releases/tag/vrep-v3.6.0 來看, 隻字未提, 但是從 https://github.com/CoppeliaRobotics/v_rep/releases/tag/v3.5.0 可以知道 3.5.0 版在 2018.02.07 釋出, 因此想知道從 3.4.0 到 3.6.0 V-rep 核心程式之間的差異, 只能自行從累次的提交內容中, 自行爬梳.
接下要進行的工作, 除了設法將最新版製作成可攜之外, 就是一連串程式編譯流程中資料的探索, 目前任務尚未完成, KMOLab 必須繼續努力.
第一個完成的任務為: V-rep 3.6.0 rev1 的可攜系統 v-rep3.6.0_rev1.7z, 先試試看能否在一般的 Windows 10 64 位元系統中執行.
執行編譯
編譯 V-rep 的第一步, 是確認系統所使用的 Lua 版本, 因為整體的 V-rep 架構都是植基於 Lua 系統原始碼之上, 截至 V-rep 3.6.0, 官方仍然使用 Lua 5.1 (目前 Lua 最新版已經來到 5.3.5), 從 https://www.lua.org/source/5.1/ 可以查看 5.1.5 原始碼中的內容, 並且可從 https://www.lua.org/ftp/ 下載 Lua 5.1 的原始碼, 之後在命令列中更換目錄到 lua-5.1 之後, 執行 mingw32-make mingw, 表示要使用 MSYS2 中的 mingw32-make 執行 MAKE, 且宣告 platform 為 mingw, 完成編譯後, 可以在 src 目錄中找到 lua.exe 與 lua51.dll.
註: mingw32-make mingw 指令可以正確編譯 lua 5.1, lua 5.1.4, lua 5.3.4 與 lua 5.3.5, 唯獨無法正確編譯 lua 5.1.5, 因為這裡只需要 lua 5.1, 因此不再處理 lua 5.1.5 編譯上的問題.
由於 V-rep 系統中也使用 lua51jit.dll, 因此可以從 http://luajit.org/download.html 下載 LuaJIT-2.0.5, 進入目錄後, 以 mingw32-make 即可完成編譯.
Lua 5.1.5 除錯
前面以為可以無需處理 Lua 5.1.5 編譯問題, 一旦進入 https://github.com/CoppeliaRobotics/v_rep/blob/562bd9fa1b22b9919a9bee03df64436b21529174/config.pri, 赫然看到 V-rep 開發者在 Windows 建議使用的 Lua 版本, 竟然就是 5.1.5 版, 因此, 還是必須處理所碰到的問題.
從 http://lua-users.org/lists/lua-l/2012-08/msg00121.html 得知 Lua 5.1.5 在釋出原始碼之後, 才發現幾個錯誤, 內容記錄於 http://www.lua.org/bugs.html#5.1.5-1, 只要按照說明更新錯誤, 即可利用 mingw32-make mingw 順利編譯出隨後所需的 lua.exe, luac.exe, lua51.dll 與 liblua.a.
下載 Kmol_lua_515_535.7z
編譯 V-rep 核心
第一步必須編輯 y:\vrep360_kmol\v_rep 目錄中的 config.pri 設定檔案, 根據目前所使用的系統設定內容修改如下:
# location of boost headers: BOOST_INCLUDEPATH = "y:/boost_1_66_0" # (e.g. Windows) #BOOST_INCLUDEPATH = "/usr/local/include" # (e.g. MacOS) # location of lua headers: LUA_INCLUDEPATH = "y:/lua-5.1.5/src" # (e.g. Windows) #LUA_INCLUDEPATH = "../../../../../mingw64/include/lua5.1" # (e.g. Windows-MSYS2) #LUA_INCLUDEPATH = "../../lua5_1_4_Linux26g4_64_lib/include" # (e.g. Ubuntu) #LUA_INCLUDEPATH = "/usr/local/include/lua5.1" # (e.g. MacOS) # lua libraries to link: LUA_LIBS = "y:/lua-5.1.5/src/liblua.a" # (e.g. Windows) #LUA_LIBS = -llua5.1 # (e.g. Windows-MSYS2) #LUA_LIBS = -L"../../lua5_1_4_Linux26g4_64_lib/" -llua5.1 # (e.g. Ubuntu) #LUA_LIBS = "/usr/local/lib/liblua5.1.dylib" # (e.g. MacOS) # qscintilla location: QSCINTILLA_DIR = "y:/QScintilla_gpl-2.10.2" # (e.g. Windows) #QSCINTILLA_DIR = "../../QScintilla-commercial-2.7.2" # (e.g. Windows-MSYS2) #QSCINTILLA_DIR = "../../QScintilla-commercial-2.7.2" # (e.g. Ubuntu) #QSCINTILLA_DIR = "../../QScintilla-commercial-2.7.2" # (e.g. MacOS) # qscintilla headers: QSCINTILLA_INCLUDEPATH = "$${QSCINTILLA_DIR}/include" "$${QSCINTILLA_DIR}/Qt4Qt5" # qscintilla libraries to link: QSCINTILLA_LIBS = "$${QSCINTILLA_DIR}/libqscintilla2_qt5d.dll.a" # (e.g. Windows) #QSCINTILLA_LIBS = "$${QSCINTILLA_DIR}/release/release/libqscintilla2.dll.a" # (e.g. Windows-MSYS2) #QSCINTILLA_LIBS = "$${QSCINTILLA_DIR}/release/libqscintilla2.so" # (e.g. Ubuntu) #QSCINTILLA_LIBS = "$${QSCINTILLA_DIR}/release/libqscintilla2.9.0.2.dylib" # (e.g. MacOS) # Make sure if a config.pri is found one level above, that it will be used instead of this one: exists(../config.pri) { include(../config.pri) }
接著在命令列中, 進入 y:\vrep360_kmol\v_rep 目錄, 執行 qmake -o Makefile v_rep.pro, 過程中將取得 Makefile.Release, 可利用 mingw32-make -f Makefile.Release 開始進行 V-rep 核心的編譯流程.
編譯結束後, 可以在 v_rep/release 目錄中得到 V-rep 系統執行所需的 v_rep.dll 與 libv_rep.dll.a.
No comments:
Post a Comment