加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Luajit 2.0.4 绑定 protoc-gen-lua (Windows 平台)

发布时间:2020-12-14 21:58:29 所属栏目:大数据 来源:网络整理
导读:上一篇??protoc-gen-lua 编译、安装、使用教程 ? 介绍了 protoc-gen-lua?的编译使用介绍,但是最后的例子,我是把?protoc-gen-lua 的 pb.c?源代码添加到工程中去进行编译的。那如果我们写了 lua?代码想直接用?lua?命令测试呢?这时候总不能每次都拿?vs?的工

上一篇??protoc-gen-lua 编译、安装、使用教程 ? 介绍了 protoc-gen-lua?的编译使用介绍,但是最后的例子,我是把?protoc-gen-lua 的 pb.c?源代码添加到工程中去进行编译的。那如果我们写了 lua?代码想直接用?lua?命令测试呢?这时候总不能每次都拿?vs?的工程来编译运行,好在我们有?Luajit 2.0.4?的源代码?和 protoc-gen-lua 中 pb.c 的源代码,代码在手天下我有,我来把这两个整合到一起,即把 protoc-gen-lua?的?pb.c?编译到 Luajit 2.0.4?中。


首先下载安装 Luajit 2.0.4 ,然后解压、编译。具体过程请看上一篇 。


然后下载安装 protobuf-2.4.1,然后解压、编译。具体过程请看上一篇。


然后下载安装 protoc-gen-lua ,然后解压、编译、具体过程请看上一篇。

转自 http://blog.csdn.net/huutu?http://www.thisisgame.com.cn

说这么多就是说?看完上一篇?再来看这一篇……

Luajit 2.0.4?的编译是在 LuaJIT-2.0.4src?中,在?Visual?Studio?控制台中?执行 msvcbuild.bat 进行编译的,编译会生成 lua51.dll 、lua51.lib、luajit.exe? 。

首先,拷贝 protoc-gen-lua-masterprotobufpb.c ?到?LuaJIT-2.0.4src 目录,然后用文本编辑器打开 msvcbuild.bat ,添加 pb.c 到链接文件列表中,修改如下

@rem Script to build LuaJIT with MSVC.
@rem Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
@rem
@rem Either open a "Visual Studio .NET Command Prompt"
@rem (Note that the Express Edition does not contain an x64 compiler)
@rem -or-
@rem Open a "Windows SDK Command Shell" and set the compiler environment:
@rem     setenv /release /x86
@rem   -or-
@rem     setenv /release /x64
@rem
@rem Then cd to this directory and run this script.

@if not defined INCLUDE goto :FAIL

@setlocal
@set LJCOMPILE=cl /nologo /c /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE
@set LJLINK=link /nologo
@set LJMT=mt /nologo
@set LJLIB=lib /nologo /nodefaultlib
@set DASMDIR=..dynasm
@set DASM=%DASMDIR%dynasm.lua
@set LJDLLNAME=lua51.dll
@set LJLIBNAME=lua51.lib
@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c

%LJCOMPILE% hostminilua.c
@if errorlevel 1 goto :BAD
%LJLINK% /out:minilua.exe minilua.obj
@if errorlevel 1 goto :BAD
if exist minilua.exe.manifest^
  %LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe

@set DASMFLAGS=-D WIN -D JIT -D FFI -D P64
@set LJARCH=x64
@minilua
@if errorlevel 8 goto :X64
@set DASMFLAGS=-D WIN -D JIT -D FFI
@set LJARCH=x86
:X64
minilua %DASM% -LN %DASMFLAGS% -o hostbuildvm_arch.h vm_x86.dasc
@if errorlevel 1 goto :BAD

%LJCOMPILE% /I "." /I %DASMDIR% hostbuildvm*.c
@if errorlevel 1 goto :BAD
%LJLINK% /out:buildvm.exe buildvm*.obj
@if errorlevel 1 goto :BAD
if exist buildvm.exe.manifest^
  %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe

buildvm -m peobj -o lj_vm.obj
@if errorlevel 1 goto :BAD
buildvm -m bcdef -o lj_bcdef.h %ALL_LIB%
@if errorlevel 1 goto :BAD
buildvm -m ffdef -o lj_ffdef.h %ALL_LIB%
@if errorlevel 1 goto :BAD
buildvm -m libdef -o lj_libdef.h %ALL_LIB%
@if errorlevel 1 goto :BAD
buildvm -m recdef -o lj_recdef.h %ALL_LIB%
@if errorlevel 1 goto :BAD
buildvm -m vmdef -o jitvmdef.lua %ALL_LIB%
@if errorlevel 1 goto :BAD
buildvm -m folddef -o lj_folddef.h lj_opt_fold.c
@if errorlevel 1 goto :BAD

@if "%1" neq "debug" goto :NODEBUG
@shift
@set LJCOMPILE=%LJCOMPILE% /Zi
@set LJLINK=%LJLINK% /debug
:NODEBUG
@if "%1"=="amalg" goto :AMALGDLL
@if "%1"=="static" goto :STATIC
%LJCOMPILE% /MD /DLUA_BUILD_AS_DLL lj_*.c lib_*.c pb.c
@if errorlevel 1 goto :BAD
%LJLINK% /DLL /out:%LJDLLNAME% lj_*.obj lib_*.obj pb.obj
@if errorlevel 1 goto :BAD
@goto :MTDLL
:STATIC
%LJCOMPILE% lj_*.c lib_*.c pb.c
@if errorlevel 1 goto :BAD
%LJLIB% /OUT:%LJLIBNAME% lj_*.obj lib_*.obj pb.obj
@if errorlevel 1 goto :BAD
@goto :MTDLL
:AMALGDLL
%LJCOMPILE% /MD /DLUA_BUILD_AS_DLL ljamalg.c
@if errorlevel 1 goto :BAD
%LJLINK% /DLL /out:%LJDLLNAME% ljamalg.obj lj_vm.obj
@if errorlevel 1 goto :BAD
:MTDLL
if exist %LJDLLNAME%.manifest^
  %LJMT% -manifest %LJDLLNAME%.manifest -outputresource:%LJDLLNAME%;2

%LJCOMPILE% luajit.c pb.c
@if errorlevel 1 goto :BAD
%LJLINK% /out:luajit.exe luajit.obj pb.obj %LJLIBNAME%
@if errorlevel 1 goto :BAD
if exist luajit.exe.manifest^
  %LJMT% -manifest luajit.exe.manifest -outputresource:luajit.exe

@del *.obj *.manifest minilua.exe buildvm.exe
@echo.
@echo === Successfully built LuaJIT for Windows/%LJARCH% ===

@goto :END
:BAD
@echo.
@echo *******************************************************
@echo *** Build FAILED -- Please check the error messages ***
@echo *******************************************************
@goto :END
:FAIL
@echo You must open a "Visual Studio .NET Command Prompt" to run this script
:END

转自 http://blog.csdn.net/huutu?http://www.thisisgame.com.cn


具体添加的内容 如图

转自 http://blog.csdn.net/huutu?http://www.thisisgame.com.cn

然后?执行? msvcbuild.bat?编译,肯定会出错的……,如下图

转自 http://blog.csdn.net/huutu?http://www.thisisgame.com.cn

提示打不开?lua.h? ,原因是?pb.c?中是用 #include<lua.h>?这种模式导入头文件


修改成 #include "lua.h"?即可


转自 http://blog.csdn.net/huutu?http://www.thisisgame.com.cn

修改后再次编译,还是会报错,不过这个错?上一篇?已经遇到过了。

是因为宏定义的问题,引入了不该引入的头文件。

用宏定义隔开不执行。


转自 http://blog.csdn.net/huutu?http://www.thisisgame.com.cn

再次编译,编译成功。

拿上一篇的测试工程,将?pb.c?从项目中移除,然后编译工程,就会提示错误

转自 http://blog.csdn.net/huutu?http://www.thisisgame.com.cn

原因是:虽然?pb.c?被添加到了 msvcbuild.bat?? 中,但是?luaopen_pb?这个函数并没有导出,所以我们再对?pb.c?进行修改。让这个函数导出

首先在开始?添加宏定义

#define LUA_LIB

然后给函数

int luaopen_pb (lua_State *L)

添加导出属性,修改为

LUA_API int luaopen_pb (lua_State *L)

再次执行 msvcbuild.bat?编译 LuaJIT-2.0.4 ,编译成功。

再次编译测试工程,编译成功。

把生成的 lua51.dll?拷贝到项目文件夹,运行,成功。

转自 http://blog.csdn.net/huutu?http://www.thisisgame.com.cn

但这并不是我们的目的,继续。


用编译 ?LuaJIT-2.0.4? 生成的 luajit.exe?去执行测试工程中的?main.lua ,发现并不能运行


原因是虽然?pb.c?中的 int luaopen_pb (lua_State *L)?被修改成了 LUA_API int luaopen_pb (lua_State *L) ,编译的时候导出了可以调用,但是在 luajit.exe 中,我们并没有调用

LUA_API int luaopen_pb (lua_State *L) 这个函数!!所以没有 load protobuf 的库。

转自 http://blog.csdn.net/huutu?http://www.thisisgame.com.cn

打开 LuaJIT-2.0.4srcluajit.c? ,在 static int pmain(lua_State *L) ?函数中添加 LUA_API int luaopen_pb (lua_State *L) 函数的调用。

如下图红框标识新添加的代码


转自 http://blog.csdn.net/huutu?http://www.thisisgame.com.cn

再次执行 msvcbuild.bat??编译 LuaJIT-2.0.4 。

再次用?luajit.exe?去运行?main.lua??脚本,终于成功运行!

转自 http://blog.csdn.net/huutu?http://www.thisisgame.com.cn


工程打包下载:

http://download.csdn.net/detail/cp790621656/9249249
http://pan.baidu.com/s/1i3trUKX

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读