2016-08-17 119 views
0

我有lua,我使用luarocks進行安裝。在c編譯期間安裝yaml與luarocks的問題

編輯: Windows系統

上我從v202-3 from here下載luasocket-2.0.2-3.win32-x86.rock文件安裝成功luasocket。它的舊版本,但它的作品。

但是現在我需要安裝yaml,所以我可以使用yaml文件。現在我不得不使用* .src.rock文件或.rockspec文件進行安裝。

我曾嘗試:

luarocks install yaml這給:

D:\user\workspace\_lua>luarocks install yaml 
Warning: Failed searching manifest: Failed fetching manifest for https://luarocks.org - Failed downloading https://luarocks.org/manifest - C:\Users\user\AppData\Local/LuaRocks/Cache/https___luarocks.org/manifest 
Warning: Failed searching manifest: Failed fetching manifest for https://raw.githubusercontent.com/rocks-moonscript-org/moonrocks-mirror/master/ - Failed downloading https://raw.githubusercontent.com/rocks-moonscript-org/moonrocks-mirror/master/manifest - C:\Users\user\AppData\Local/LuaRocks/Cache/https___raw.githubusercontent.com_rocks-moonscript-org_moonrocks-mirror_master_/manifest 
Warning: Failed searching manifest: Failed fetching manifest for http://luafr.org/moonrocks/ - Failed downloading http://luafr.org/moonrocks/manifest - C:\Users\user\AppData\Local/LuaRocks/Cache/http___luafr.org_moonrocks_/manifest 
Warning: Failed searching manifest: Failed fetching manifest for http://luarocks.logiceditor.com/rocks - Failed downloading http://luarocks.logiceditor.com/rocks/manifest - C:\Users\user\AppData\Local/LuaRocks/Cache/http___luarocks.logiceditor.com_rocks/manifest 

Error: No results matching query were found. 

所以,後來我下載yaml-1.1.2-1.src.rock和運行命令: luarocks install yaml-1.1.2-1.src.rock

這告訴我,我不得不依賴YAML - > lub - > luafilesystem。所以後來我下載:

  • luafilesystem-1.6.3-2.src.rock
  • LUB-1.1.0-1.src.rock
  • YAML的1.1.2-1.src.rock

我安裝它們的其他與之後的結果之一:

  • luarocks install luafilesystem-1.6.3-2.src.rock - OK
  • luarocks install lub-1.1.0-1.src.rock - OK
  • luarocks install yaml-1.1.2-1.src.rock - 失敗,請參見下面

錯誤日誌中的錯誤:

D:\user\downloads\luarocks-2.3.0-win32\extras>luarocks install yaml-1.1.2-1.src.rock 
Using yaml-1.1.2-1.src.rock... switching to 'build' mode 
mingw32-gcc -O2 -c -o src/api.o -ID:/user/install/lua/luarocks/include src/api.c -Isrc 
mingw32-gcc -O2 -c -o src/b64.o -ID:/user/install/lua/luarocks/include src/b64.c -Isrc 
mingw32-gcc -O2 -c -o src/dumper.o -ID:/user/install/lua/luarocks/include src/dumper.c -Isrc 
mingw32-gcc -O2 -c -o src/emitter.o -ID:/user/install/lua/luarocks/include src/emitter.c -Isrc 
mingw32-gcc -O2 -c -o src/loader.o -ID:/user/install/lua/luarocks/include src/loader.c -Isrc 
mingw32-gcc -O2 -c -o src/lyaml.o -ID:/user/install/lua/luarocks/include src/lyaml.c -Isrc 
mingw32-gcc -O2 -c -o src/parser.o -ID:/user/install/lua/luarocks/include src/parser.c -Isrc 
mingw32-gcc -O2 -c -o src/reader.o -ID:/user/install/lua/luarocks/include src/reader.c -Isrc 
mingw32-gcc -O2 -c -o src/scanner.o -ID:/user/install/lua/luarocks/include src/scanner.c -Isrc 
mingw32-gcc -O2 -c -o src/strtod.o -ID:/user/install/lua/luarocks/include src/strtod.c -Isrc 
In file included from src/strtod.c:23:0: 
src/strtod.c:24:17: warning: '_errno' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes] 
extern int  errno; 
       ^
mingw32-gcc -O2 -c -o src/writer.o -ID:/user/install/lua/luarocks/include src/writer.c -Isrc 
mingw32-gcc -shared -o yaml/core.dll src/api.o src/b64.o src/dumper.o src/emitter.o src/loader.o src/lyaml.o src/parser.o src/reader.o src/scanner.o src/strtod.o src/writer.o D:/user/install/lua/luarocks/lua5.1.lib -lMSVCR80 
src/api.o:api.c:(.text+0x395): undefined reference to '_imp__yaml_realloc' 
src/api.o:api.c:(.text+0x412): undefined reference to '_imp__yaml_string_extend' 
      : 
    LOTS OF THESE 
      : 
src/scanner.o:scanner.c:(.text.unlikely+0x29d0): undefined reference to '_imp__yaml_queue_extend' 
src/scanner.o:scanner.c:(.text.unlikely+0x29e8): undefined reference to '_imp__yaml_token_delete' 
collect2.exe: error: ld returned 1 exit status 

Error: Build error: Failed compiling module yaml/core.dll 

有誰知道爲什麼會生成失敗? - 我從這裏直接得到它:https://luarocks.org/modules/gaspard/yaml/1.1.2-1這是最下載的版本...所以我想它應該工作?

我的意思是,我可以看到錯誤是什麼......但我不明白爲什麼應該有錯誤。我怎樣才能解決這個問題?...任何幫助表示讚賞:)

UPDATE

由於siffiejoe的評論,我是能夠編譯YAML的岩石。這裏是輸出:

D:\user\downloads\luarocks-2.3.0-win32\extras>luarocks install yaml-1.1.2-1.src.rock CC="gcc -DYAML_DECLARE_STATIC" 
Using yaml-1.1.2-1.src.rock... switching to 'build' mode 
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/api.o -ID:/user/install/lua/luarocks/include src/api.c -Isrc 
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/b64.o -ID:/user/install/lua/luarocks/include src/b64.c -Isrc 
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/dumper.o -ID:/user/install/lua/luarocks/include src/dumper.c -Isrc 
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/emitter.o -ID:/user/install/lua/luarocks/include src/emitter.c -Isrc 
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/loader.o -ID:/user/install/lua/luarocks/include src/loader.c -Isrc 
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/lyaml.o -ID:/user/install/lua/luarocks/include src/lyaml.c -Isrc 
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/parser.o -ID:/user/install/lua/luarocks/include src/parser.c -Isrc 
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/reader.o -ID:/user/install/lua/luarocks/include src/reader.c -Isrc 
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/scanner.o -ID:/user/install/lua/luarocks/include src/scanner.c -Isrc 
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/strtod.o -ID:/user/install/lua/luarocks/include src/strtod.c -Isrc 
In file included from src/strtod.c:23:0: 
src/strtod.c:24:17: warning: '_errno' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes] 
extern int  errno; 
       ^
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/writer.o -ID:/user/install/lua/luarocks/include src/writer.c -Isrc 
mingw32-gcc -shared -o yaml/core.dll src/api.o src/b64.o src/dumper.o src/emitter.o src/loader.o src/lyaml.o src/parser.o src/reader.o src/scanner.o src/strtod.o src/writer.o D:/user/install/lua/luarocks/lua5.1.lib -lMSVCR80 
Updating manifest for D:\user\install\lua\luarocks\systree/lib/luarocks/rocks 
yaml 1.1.2-1 is now built and installed in D:\user\install\lua\luarocks\systree (license: MIT) 

所以它說它被安裝。然而,當我嘗試使用YAML裝箱率也沒有找到它:

local yaml = require("yaml") 
local data = yaml.load("mytest.yaml") 

系統報告說,它無法找到yaml.lua或yaml.dll。然後我搜索* .lua和*。DLL在我luarocks文件夾中,我發現:

D:\user\install\lua\luarocks\systree>dir *.lua *.dll /b /s 
D:\user\install\lua\luarocks\systree\lib\lua\5.1\lfs.dll 
D:\user\install\lua\luarocks\systree\lib\lua\5.1\mime\core.dll 
D:\user\install\lua\luarocks\systree\lib\lua\5.1\socket\core.dll 
D:\user\install\lua\luarocks\systree\lib\lua\5.1\yaml\core.dll 
D:\user\install\lua\luarocks\systree\lib\luarocks\rocks\luafilesystem\1.6.3-2\tests\test.lua 
D:\user\install\lua\luarocks\systree\share\lua\5.1\ltn12.lua 
D:\user\install\lua\luarocks\systree\share\lua\5.1\mime.lua 
D:\user\install\lua\luarocks\systree\share\lua\5.1\socket.lua 
D:\user\install\lua\luarocks\systree\share\lua\5.1\lub\Autoload.lua 
D:\user\install\lua\luarocks\systree\share\lua\5.1\lub\Dir.lua 
D:\user\install\lua\luarocks\systree\share\lua\5.1\lub\init.lua 
D:\user\install\lua\luarocks\systree\share\lua\5.1\lub\Param.lua 
D:\user\install\lua\luarocks\systree\share\lua\5.1\lub\Template.lua 
D:\user\install\lua\luarocks\systree\share\lua\5.1\socket\ftp.lua 
D:\user\install\lua\luarocks\systree\share\lua\5.1\socket\http.lua 
D:\user\install\lua\luarocks\systree\share\lua\5.1\socket\smtp.lua 
D:\user\install\lua\luarocks\systree\share\lua\5.1\socket\tp.lua 
D:\user\install\lua\luarocks\systree\share\lua\5.1\socket\url.lua 
D:\user\install\lua\luarocks\systree\share\lua\5.1\yaml\init.lua 

例如,我設法與luarocks install luasocket-2.0.2-3.win32-x86.rock安裝luasocket因爲有一個.rock文件中。所以你可以看到有一個socket.lua。對於YAML,滑油和luafilesystem我可以看到不同的安裝位置,但沒有.lua或.dll文件... 我搜索更多YAML具體爲:

D:\user\install\lua\luarocks\systree>dir *yaml* /b /s 
D:\user\install\lua\luarocks\systree\lib\lua\5.1\yaml 
D:\user\install\lua\luarocks\systree\lib\luarocks\rocks\yaml 
D:\user\install\lua\luarocks\systree\lib\luarocks\rocks\yaml\1.1.2-1\yaml-1.1.2-1.rockspec 
D:\user\install\lua\luarocks\systree\share\lua\5.1\yaml 

EHH ......所以後來我去了,克隆了git的項目(必須下載的zip文件,因爲我愚蠢的IT擋住了我的git克隆...(端口443)

所以最後得到了排序,然後在我嘗試了YAML的主文件夾:

luarocks make yaml-1.1.2-1.rockspec CC-"gcc -DYAML_DECLARE_STATIC"

這與之前的效果相同。所以,現在我已經嘗試都.src.rock和.rockspec類型...

我再次陷入:(

更新2

當我從git的建成,有一個名爲yaml.lua在頂層,但它包含的是文本yaml/init.lua ...不知道該怎麼做 - 嘗試將其複製到我的..install\lua\luarocks\systree\share\lua\5.1目錄中,但是當我運行我的測試lua projam時,它會給出錯誤.. ..這是怎麼回事,它不能這麼難安裝:(

更新3

繼續從siffiejoe的偉大的答案,我已經或多或少得到這yaml安裝。但我運行一個bug:

這裏是我的LUA腳本:

package.path = "D:\\user\\install\\lua\\luarocks\\systree\\share\\lua\\5.1\\?\\init.lua;" .. package.path 
print("package.path: " .. package.path) 
local yaml = require("yaml") 
local data = yaml.load("mytest.yaml") 

我手動添加LUA路徑,現在我正在測試一段時間。當我運行此我得到的窗口:

enter image description here

而且我的日誌是這樣的:

D:\user\install\lua\luarocks\systree\share\lua\5.1\?\init.lua;D:\user\install\lua\luarocks\systree\share\lua\5.1\?.lua;D:\user\install\lua\luarocks\systree\share\lua\5.1\?\init.lua;./?.lua;./?/init.lua;./lua/?.lua;./lua/?/init.lua;D:\user\install\lua\zerobrane\lualibs/?/?.lua;D:\user\install\lua\zerobrane\lualibs/?.lua;D:\user\install\lua\zerobrane\lualibs/?/?/init.lua;D:\user\install\lua\zerobrane\lualibs/?/init.lua 
D:\user\install\lua\zerobrane\bin\lua.exe: error loading module 'lfs' from file 'D:\user\install\lua\luarocks\systree\lib\lua\5.1\lfs.dll': 
    The specified procedure could not be found. 


stack traceback: 
    [C]: at 0x66df0460 
    [C]: in function 'require' 
    ...\install\lua\luarocks\systree\share\lua\5.1\lub\init.lua:17: in main chunk 
    [C]: in function 'require' 
    ...install\lua\luarocks\systree\share\lua\5.1\yaml\init.lua:25: in main chunk 
    [C]: in function 'require' 
    D:\user\workspace\_lua\myluatest.lua:3: in main chunk 
    [C]: at 0x00402a57 
Program completed in 56.64 seconds (pid: 15856). 

所以它似乎回到這個MSVCR80.DLL ......這不是決策意識對我來說,我認爲這是與微軟做...有些事情我讀過它可能是一個損壞的MSVCR80.dll需要替換或somthing。但我不確定這是爲什麼發生。有什麼想法嗎?

+0

可能是因爲你的LuaRocks是使用mingw(在跟蹤/日誌中使用'mingw-gcc')安裝的,而yaml安裝嘗試使用MS VCR庫:'-lMSVCR80' – hjpotter92

+0

@ hjpotter92這是一個很好的觀點,我沒有發現這是微軟文件。那裏做的是什麼; o ..他的其他庫都使用了mingw32-gcc。任何想法如何解決這個問題?我的電腦上有MSVC2010。 **編輯**也在他的git repo中說明要運行'luarocks make'(一旦你克隆該項目) - 這也會產生相同的錯誤 –

+0

@code_fodder:嘗試'luarocks install yaml-1.1.2-1.src .rock CC =「mingw32-gcc -DYAML_DECLARE_STATIC」' – siffiejoe

回答

3

的包括來自github repository文件src/yaml.h包含以下預處理器代碼:

#ifdef WIN32 
# if defined(YAML_DECLARE_STATIC) 
#  define YAML_DECLARE(type) type 
# elif defined(YAML_DECLARE_EXPORT) 
#  define YAML_DECLARE(type) __declspec(dllexport) type 
# else 
#  define YAML_DECLARE(type) __declspec(dllimport) type 
# endif 
#else 
# define YAML_DECLARE(type) type 
#endif 

這意味着,在Windows默認情況下,所有YAML相關的功能與__declspec(dllimport)(在_imp__前綴的鏈接程序錯誤消息的裝飾是提示)。因此,鏈接器期望這些函數位於外部DLL中。但yaml代碼與Lua綁定捆綁在一起並編譯成單個DLL yaml\core.dll,因此鏈接器會發出抱怨。解決這個問題的正確方法是從yaml函數中刪除所有與導入/導出相關的裝飾,這可以通過定義YAML_DECLARE_STATIC來實現。這個宏一定要在rockspec設置(我將在稍後發佈錯誤報告),但一個快速和骯髒的解決方案是通過在命令行中CC變量設置:

luarocks install yaml-1.1.2-1.src.rock CC="mingw32-gcc -DYAML_DECLARE_STATIC" 

之後,應該有一個yaml\core.dll文件和一個yaml\init.lua文件在您的LuaRocks目錄中。要使用Lua yaml綁定,您必須確保require("yaml")加載yaml\init.lua文件,並且該require("yaml.core")加載yaml\core.dll。這可以通過添加到package.path/package.cpath(從您的Lua腳本中)或優選地通過添加到LUA_PATH/LUA_CPATH來實現。由於已安裝的LuaSocket已經可以正常工作,所以您可能已經正確設置了大多數設置,但yaml綁定使用不同的方法來加載其主要Lua模塊,而不是使用LuaSocket:LuaSocket有socket.lua,對於require("socket"),但yaml有yaml\init.lua對於require("yaml")。這種方法的優點是,任何Lua子模塊(例如yaml.a)都與主Lua模塊的代碼位於相同的目錄中。無論如何,您還必須添加

D:\user\install\lua\luarocks\systree\share\lua\5.1\?\init.lua 

到您的LUA_PATH環境變量。

Btw。,您在github存儲庫中找到的yaml.lua文件是一個符號鏈接,無論如何不會在Windows上正常工作(但可能會干擾,因此您不應將其放入您的岩石樹中)。這只是爲了方便開發。

+0

哦,我看到你已經提交了一個錯誤報告... – siffiejoe

+0

真棒的答案! - 如果我可以upvote它,我會:)我還沒有完成所有的步驟,只是要做到這一點,但它讓我很有信心,我知道發生了什麼事情。假設我需要爲lub和luafilesystem(路徑明智)做同樣的事情。因爲在我看來,它應該是開箱即用的,或者應該有指示要做什麼,但我沒有深入的知識或推理,也許你可以將它添加到bug中報告(或我可以) –

+0

@code_fodder:lub需要相同的補充,是的,但你只需要爲兩者做一次(路徑模板的特定於yaml的部分是我的部分的複製粘貼錯誤 - 現在已經修復)。 luafilesystem沒有純粹的Lua模塊,所以在那裏沒有必要。我已經將這個問題的必要信息和鏈接添加到您的錯誤報告中。 – siffiejoe