2016-08-17 1 views
0

나는 lua를 가지고 있는데, luarocks를 사용하지 않았습니다.c 컴파일 중 luarocks와 함께 lua 용 yaml을 설치하는 데 문제가 있습니다

편집 : 윈도우 시스템

I 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
  • 를 1,396,340,443,210 - OK
  • luarocks install yaml-1.1.2-1.src.rock - FAILED,

오류 로그 아래 오류를 참조하십시오이 빌드가 실패하는 이유

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의 packge를 사용하려고 할 때 그것을 발견하지 않습니다

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

시스템은이 yaml.lua 또는 yaml.dll을 찾을 수 없음을보고합니다. 그런 다음 * .lua와 *를 검색했습니다.내 luarocks 폴더에 dll을 내가 발견

예를 들어
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 

.rock 파일을 사용할 수 있었기 때문에, 나는 luarocks install luasocket-2.0.2-3.win32-x86.rock와 luasocket를 설치할 수 있었다. 그래서 socket.lua가 있음을 알 수 있습니다. YAML, LUB 및 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 

무슨 소리가 ... 그래서 그때 가서 자식에서 프로젝트를 복제 (IT 내 자식 클론 (포트 443)를 차단 바보 내 때문에 zip 파일을 다운로드했다

그래서 결국 내가 시도 YAML 마스터 폴더에 다음, 즉 정렬 가지고 :.

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

이전과 같은 효과가있었습니다. 그래서 지금 내가 자식에서 구축 할 때,라는 파일이 있었다 2

.src.rock 및 .rockspec 유형 ...

내가 다시 붙어 :(

UPDATE 모두 시도 yaml.lua는 최상위 레벨에 있습니다.하지만 그 내용은 모두 yaml/init.lua입니다. 그걸로 무엇을해야할지 모르겠습니다. 내 ..install\lua\luarocks\systree\share\lua\5.1 dir에 복사를 시도했지만, 테스트 루아 projam을 실행하면 오류가납니다. .. 무슨 일이 벌어지고 있어도 설치가 어렵지 않습니다. (

UPDATE 3

siffiejoe의 훌륭한 대답을 이어 받아,이 yaml을 다소 설치했습니다.

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") 

내가 수동으로 지금은 테스트입니다 잠시 동안 루아 경로를 추가하고 :

가 여기 내 루아 스크립트입니다 :하지만 그것을 실행하는 버그가 있습니다. 나는이 프로그램을 실행할 때 나는 창을 얻을 :

enter image description here

그리고처럼 내 로그 같습니다 그래서이 MSVCR80.dll에 돌아올 것으로 보인다

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이 될 수있다. 그러나 이것이 왜 발생하는지 아직 확실하지 않습니다. 이견있는 사람?

#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__ 접두사로했다 장식되어 있음을 의미합니다 :

+0

아마 mingw (traceback/logs에서'mingw-gcc '사용)를 사용하여 LuaRocks를 설치했기 때문에 yaml 설치가 MS VCR 라이브러리를 사용하려고합니다 :'-lMSVCR80' – hjpotter92

+0

@ hjpotter92 좋은 지적입니다, 나는 그 파일이 마이크로 소프트 파일인지 알지 못했다. 그곳에서 뭐하는거야, 그의 다른 libs 모두 mingw32-gcc와 함께 일했다. 어떤 생각이 어떻게 해결할 수 있습니까? 내 PC에 MSVC2010이 있습니다. ** 편집 ** 또한 그의 git repo에서 그의 instuction은'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을 포함는 다음 처리기 코드를 포함 힌트). 이 때문에 링커에서는 이러한 함수가 외부 DLL에 있어야합니다. 그러나 yaml 코드는 번들로 묶어서 하나의 DLL yaml\core.dll에 Lua 바인딩과 함께 컴파일되므로 링커가 불평합니다.이 문제를 해결하는 올바른 방법은 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 디렉토리에 있습니다. 루아 yaml 바인딩을 사용하려면 require("yaml")yaml\init.lua 파일을로드하고 require("yaml.core")yaml\core.dll을로드해야합니다. 이것은 package.path/package.cpath (Lua 스크립트 내에서)에 추가하거나 바람직하게는 LUA_PATH/LUA_CPATH에 추가하여 얻을 수 있습니다. 설치된 LuaSocket 이미 작동하기 때문에, 당신은 아마 LUA_PATH/LUA_CPATH 대부분이 올바르게 설정되어 있지만, 바인딩 YAML은 LuaSocket보다 주요 루아 모듈을로드하기 위해 다른 접근 방식을 사용 LuaSocket는 require("socket")에 대한 socket.lua이 있지만, YAML은 require("yaml")에 대한 yaml\init.lua 있습니다. 이러한 접근 방식은 모든 Lua 서브 모듈 (예 : yaml.a)이 주 Lua 모듈의 코드와 동일한 디렉토리에 있다는 이점이 있습니다. 어쨌든 LUA_PATH 환경 변수에

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

을 추가해야합니다.

btw., github 저장소에있는 yaml.lua 파일은 심볼릭 링크이며 Windows에서 제대로 작동하지 않습니다 (하지만 간섭 할 수 있으므로 바위 나무에 넣지 않아야합니다). 그것은 개발 중에 편의를 위해서만 존재합니다.

+0

아, 이미 버그 보고서를 제출 했으니 까 ... – siffiejoe

+0

멋진 답변! - 내가 더 upvote 할 수 있다면 :) 나는 아직 모든 단계를 밟지 않았지만 곧 그 일을하려하지만, 내가 무슨 일이 일어나고 있는지에 대해 큰 확신을 주며 아마 lub와 luafilesystem (path-wise)에 대해서도 똑같이해야 할 것이다. 어제 버그 보고서를 추가했습니다. 왜냐하면 내 마음 속에는 그것들이 작동하지 않아야하거나 지시 사항이 있어야하기 때문입니다.하지만 당신이 가지고있는 심층적 인 지식이나 추론은 없었습니다. 아마도 이것을 버그에 추가 할 수 있습니다. (또는 할 수 있습니다.) –

+0

@code_fodder : lub도 같은 추가가 필요합니다. 그렇지만 당신은 한 번만 두 번 할 필요가 있습니다 (경로 템플릿의 yaml 특정 부분은 내 파트의 복사 - 붙여 넣기 오류였습니다 - 이제는 고쳐졌습니다). luafilesystem은 순수한 Lua 모듈을 가지고 있지 않으므로 거기에 불필요하다. 필요한 정보와이 질문에 대한 링크를 버그 보고서에 추가했습니다. – siffiejoe

관련 문제