{--1、环境--}

为了快速入手,使用了小巧快速的vc++6.0编译器

以及在官网下载了Lua安装包..官网地址{--http://10.21.210.18/seeyon/index.jsp--}

两者都安装好后,即可进行

{--2、工程以及配置--}

1、首先用vc++6.0创建一个简单的win32 console application

2、从Lua的安装目录下复制include和lib两个目录下的文件到刚刚创建的工程的目录下。

  {include:包含了lua的.h头文件}

  {lib:包含了lua的动态链接库dll}

3、为了使vc++6.0编译和链接时能找到所需的Lua文件

  {在工程下添加刚刚复制过来的所有.h文件,保证编译通过}

   {在编译器里面设置dll{工程-设置-对象/库模块 那一行的最后添加 lua5.1.lib lua51.lib,保证链接时通过}}

{--3、C++与Lua相互调用例子--}

要调用Lua,首先我们得写一个简单的Lua文件,并把该文件保存到一个路径下,这里比如路径是{F:\\Lua}

function add(x, y)
n1, n2 = clib();//关于clib()是一个C函数,稍后会介绍到。
print("The first arg"..n1);
print("The second arg"..n2);
return x + y
end

该函数用于计算从C函数传递过来的的两个参数x,y的和。

另外为了方便,这函数里面同时也演示了如何调用Lua如何调用C函数clib()

接下来我们开始编写主函数

#include<stdlib.h>

// 这是个C++程序, 所以要extern "C",
// 因为lua的头文件都是C格式的
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
} lua_State* L; /* the Lua interpreter */ //给lua调用的c函数必须定义成static int XXX(lua_State *L)
static int clib(lua_State *L)
{
  lua_pushnumber(L, 100);
  lua_pushnumber(L, 200);
return 2;
  //lua调用该函数将从栈中,取2个结果
}

//此处C++调用了Lua函数
int luaadd (int x, int y)
{
int sum;
/* the function name */
lua_getglobal(L, "add");
/* the first argument */
lua_pushnumber(L, x);
/* the second argument */
lua_pushnumber(L, y);
/* call the function with 2 arguments, return 1 result */
//说明调用的函数是带有2个参数和1个返回值
lua_call(L, 2, 1); /* get the result */
sum = (int)lua_tonumber(L, -1);
lua_pop(L, 1); return sum;
} int main(int argc, char* argv[])
{
int sum; /* initialize Lua */
L = luaL_newstate();//创建一个指向lua解释器的指针
/* load Lua base libraries */
luaL_openlibs(L);
lua_register(L, "clib", clib);
/* load the script */
/*Lcc.lua是这个C++程序调用的Lua文件,
注意luaL_dofile()函数的第二个参数要写绝对路径,否则执行后会提示
“unprotected error in call to lua api(attampt to call a nil value)”错误 */
luaL_dofile(L, "F:\\lua\\Lcc.lua"); /* call the add function */
sum = luaadd(10, 15); /* print the result */
printf( "The sum is %d\n", sum ); /* cleanup Lua */
lua_close(L);
system("pause");
return 0;
}

以上的clib()函数就是Lua文件里面要调用的函数

关键代码:lua_register(L, "clib", clib);将函数注册到Lua栈中,使得Lua可以调用到。

而C++如何调用Lua

关键代码:luaL_dofile()以及luaadd()函数

-------------------------------------------------------------------------------------

                                    By Alwaystiys..

                                    From 2014.09.05

                                    At Gz.

Lua与C++相互调用的更多相关文章

  1. lua编程之lua与C相互调用

    lua是扩展性非常良好的语言,虽然核心非常精简,但是用户可以依靠lua库来实现大部分工作.除此之外,lua还可以通过与C函数相互调用来扩展程序功能.在C中嵌入lua脚本既可以让用户在不重新编译代码的情 ...

  2. uLua学习笔记(三):Unity3D和Lua之间的相互调用

    这篇笔记主要集中学习一下uLua和Unity3D之间相互调用的方法,我们导入了uLua之后,现在会弹出一个类似学习屏幕的东西,如下: 先赞一个! Unity3D调用Lua Unity3D调用Lua的方 ...

  3. lua语言自学知识点----Lua与.Net相互调用

    知识点: LuaInterface作用是用来完成Lua与C#的相互调用. LuaInterface核心库:1.luainterface.dll 用于C#读取lua(放在bin目录同级) 2.luane ...

  4. Lua 与 OC 相互调用

    本文主要讲如何完成lua和object-c的相互调用.       lua是一种脚本语言,可以方便的移植到各种宿主语言中,并且可以支持热更新,在游戏开发中也能当做主要的语言来编写游戏的逻辑,但是要接入 ...

  5. C和Lua之间的相互调用

    前面的话 第一次接触Lua是因为Unity游戏中需要热更,但是一直没搞懂Lua是怎么嵌入到别的语言中执行的,如何互相调用的.这次打算好好了解一下C跟lua是如何交互的 那么如何使用Lua语言? lua ...

  6. C#与lua相互调用

    Lua是一种很好的扩展性语言,Lua解释器被设计成一个很容易嵌入到宿主程序的库.LuaInterface则用于实现Lua和CLR的混合编程. (一)C#调用Lua 测试环境:在VS2015中建一个C# ...

  7. C程序与Lua脚本相互调用

    Lua脚本是一种可用于C程序开发/测试的工具,本篇介绍一下C程序与Lua脚本如何进行相互调用,更加详细的操作参见<Programing in Lua>.本文分为3个部分:1.Windows ...

  8. Unity3D 预备知识:C#与Lua相互调用

    在使用Unity开发游戏以支持热更新的方案中,使用ULua是比较成熟的一种方案.那么,在使用ULua之前,我们必须先搞清楚,C#与Lua是怎样交互的了? 简单地说,c#调用lua, 是c# 通过Pin ...

  9. 原生实现C#和Lua相互调用-Unity3D可用

    引言     本篇简单介绍如何在C#中执行Lua脚本,传递数据到Lua中使用,以及Lua中调用C#导出的方法等.在Unity中开发测试,并打IL2CPP的Android包在模拟器上运行通过.Lua版本 ...

随机推荐

  1. HQL 参数绑定、唯一结果、分页、投影总结(下)

    分页: 在用hibernate封装的分页方法前,我们先回顾一下,Oracle里面原生分页做法 --分页查询 --(pageNo-1)*pagesize=起始行 pageNo*pagesize=结束行 ...

  2. python成长之路【第二篇】:列表和元组

    1.数据结构数据结构是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构.在Python中,最基本的数据结构是序列(sequence) ...

  3. Bootstrap结合BootstrapTable的使用,分为两种模试显示列表。 自适应表格

    引用的css: <link href="@Url.Content("~/Css/bootstrap.min.css")" rel="styles ...

  4. CentOS6.8下部署Zabbix3.0

    Centos6.8下部署安装zabbix3.0: 环境要求 PHP >= 5.4  (CentOS6默认为5.3.3,需要更新) curl >= 7.20 (如需支持SMTP认证,需更新) ...

  5. centos下整合PagerDuty、nagios初探(on-call尝鲜和体验)

    [前言] 今天在某个群里看见有人介绍了PagerDuty,介绍到了slack.整合后可以更加方便和团队合作.于是我觉得来尝尝鲜. [PagerDuty是什么?] PagerDuty是一款能够在服务器出 ...

  6. Nginx 支持 CI 框架的配置并禁止使用 ip 访问

    #CIserver {        listen      80;        server_name www.ci.com;        index       index.php index ...

  7. WCF初探-8:WCF服务承载 (上)

    前言 任何一个程序的运行都需要依赖一个确定的进程中,WCF服务也不例外.如果使用WCF服务,我们就必须将服务承载于创建它并控制它的上下文和生存期的运行时环境中,承载服务环境的程序,我们称之为宿主.WC ...

  8. 在 Linux 中用 nmcli 命令绑定多块网卡

    今天,我们来学习一下在 CentOS 7.x 中如何用 nmcli(Network Manager Command Line Interface:网络管理命令行接口)进行网卡绑定. 网卡(接口)绑定是 ...

  9. 关于ImageLoader的详细介绍

    转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/26810303),请尊重他人的辛勤劳动成果,谢谢! 相信大家 ...

  10. C# 反射/映射学习

    反射其实就是为了能够在程序运行期间动态的加载一个外部的DLL集合,然后通过某种办法找到这个DLL集合中的某个空间下的某个类的某个成员(通过反射可以访问该类所包含的所有成员,不论成员是公有还是私有) 1 ...