一、编译准备

1.1.编译环境

OS:win10
编译器:Mingw 32 bit
QT版本:QT 5.9

1.2.编译文件

lua-5.1.5

二、编译步骤

2.1.文件下载

csdn传送门 打包 lua源码+编译的库+测试项目+tolua++

lua官网传送门 下载版本lua-5.1.5

LUA vs2017编译 lua如何编译_QT


打开lua-5.1.5.tar.gz压缩文件后,我们只要src这个文件夹的文件,解压出来。

2.2.建立QT项目

项目命名lualib

LUA vs2017编译 lua如何编译_#include_02


这里选静态库

LUA vs2017编译 lua如何编译_lua_03


编译器我是mingw 32 bit

LUA vs2017编译 lua如何编译_#include_04


去掉勾选的QtCore

LUA vs2017编译 lua如何编译_#include_05


新建的目录结构

LUA vs2017编译 lua如何编译_QT_06


删除自动创建的头文件和cpp文件,变为

LUA vs2017编译 lua如何编译_qt_07

2.3.导入源码到项目

右键pro文件,打开项目目录

LUA vs2017编译 lua如何编译_#include_08


将lua源码放入目录

LUA vs2017编译 lua如何编译_LUA vs2017编译_09


右键点击项目导入文件

LUA vs2017编译 lua如何编译_lua_10


scr目录下得文件全选

LUA vs2017编译 lua如何编译_qt_11


打开pro文件

LUA vs2017编译 lua如何编译_lua_12


注释掉lua.c luac.c

LUA vs2017编译 lua如何编译_QT_13


切换到relase模式

LUA vs2017编译 lua如何编译_LUA vs2017编译_14


点击构建

LUA vs2017编译 lua如何编译_lua_15


构建完成后,到项目目录relase目录,找到liblualib.a

LUA vs2017编译 lua如何编译_qt_16

LUA vs2017编译 lua如何编译_LUA vs2017编译_17


复制出liblualib.a与scr文件夹

LUA vs2017编译 lua如何编译_QT_18


目前为止lua静态库编译完成。

三、使用编译库

3.1.项目建立

新建一个qt控制台程序

LUA vs2017编译 lua如何编译_#include_19


打开项目目录

LUA vs2017编译 lua如何编译_lua_20


将刚刚编译的库与src文件复制到该目录下

LUA vs2017编译 lua如何编译_lua_21

3.2.程序源码

增加这两句 $$PWD是当前目录,运行qmake

LIBS+=$$PWD/liblualib.a
INCLUDEPATH+=$$PWD/src

LUA vs2017编译 lua如何编译_lua_22


LUA vs2017编译 lua如何编译_qt_23


mian文件代码:

#include <QCoreApplication>

#include <stdio.h>

extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}

lua_State *L;
int countsum(int x,int y)
{
    int sum;
    lua_getglobal(L,"sum");//指向需要调用的lua函数
    //压入参数
    lua_pushnumber(L,x);//压入第一个参数
    lua_pushnumber(L,y);//压入第二个参数
    //调用函数
    lua_pcall(L,2,1,0); //压入两个参数,返回一个结果
    //取得结果
    sum = (int)lua_tonumber(L,-1); //取得栈顶元素
    lua_pop(L,1); //清理栈
    return sum;
}

int  setnum(int num){
    return 100-num;
}

static int testfuction(lua_State* L)
{
    int num = (int)lua_tonumber(L, -1);  //从lua中取得一个数
    lua_pushnumber(L, setnum(num));
    printf("fuction start!!!!!\n");
    printf("lua input number is=%d\n",num);
    return 1;
}




int main(int argc, char *argv[])
{


    QCoreApplication a(argc, argv);
    L =  luaL_newstate();//新建lua虚拟机
    luaL_openlibs(L);//加载lua的string math等库
    luaL_dofile(L,"E:/testaaaaaa/test/test/test.lua");//绝对路径 执行脚本文件
    int sum = countsum(100,200);
    printf("test result is= %d\r\n", sum);
    lua_close(L); //关闭lua文件

    lua_State* L = lua_open();
    luaopen_base(L);

    // C++的函数和封装函数都必须是静态的,不可以是非静态的
    lua_register(L, "testfuction", testfuction);
    luaL_dofile(L, "E:/testaaaaaa/test/test/test2.lua"); //绝对路径
    lua_close(L);



    return a.exec();
}

lua文件
test.lua

function sum(x,y)
       return x + y 
end

test2.lua

local num=testfuction(10);