关于Lua调用c++ DLL 文件的详解
2012-10-09 11:43
831 查看
Lua调用c++ dll文件的详解
尽管网上类似的例子不少,但是对于很多新手来说,有些问题并没有说的那么详细
直奔主题
在此,我会列出我参考的文章,有些东西就直接复制的
环境:Visual C++ 2008 Express Edition + Lua 1.5 + SciTE(lua编辑器)
下载 Visual C++ 2008 Express Edition + Lua ,下载后安装,省略N字。
环境配置:
1.打开Visual C++ 2008(后面简称VC2008),新建一个C++ project,File->New Project->Empty Project,在Name栏输入工程名,然后OK.
2.设置生成DLL文件,右键工程名,Properties->Configuration Properties->General->Configuration Type->选择Dynamic Library(.dll)
3.设置C/C++、Lua。C/C++->General->Additional Include Directories->选择Lua的安装路径下的include,我Lua安装在"C:\Program Files\Lua",我的完整路径:"C:\Program Files\Lua\5.1\include"。
4.设置Linker:Linker->General->Additional Library Directories->选择Lua安装目录下的lib目录就可以了。我的完整路径:"C:\Program Files\Lua\5.1\lib".
5.设置Input:Input->Additional Dependencies->这里手动输入"lua5.1.lib"就可以了。点击确认。
Test Lua调用C++函数
1.选择Source Files,右键Add->New Item->选择 C++ File(.cpp)->Add->Name栏输入hello->Add。
2.在hello.cpp文件中输入下面Code.
Test Lua调用C++函数
1.选择Source Files,右键Add->New Item->选择 C++ File(.cpp)->Add->Name栏输入hello->Add。
2.在hello.cpp文件中输入下面Code.
//----------依赖文件-----------
//因为建的是C++ Project,所以这里必须要加extern "C" ,如果不加这个是没办法编译的。
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
#include <windows.h>
#include <wincrypt.h>
//因为建的是C++ Project,所以这里必须要加extern "C"
extern "C" int hello(lua_State* L){
printf("------>> Hi! %s \n",(LPTSTR)lua_tostring(L,1));
return 0;
}
//--------注册函数-----------
struct luaL_reg lrLibs[] =
{
{ "hello", hello },
{ NULL, NULL } /* sentinel */
};
// 该函数是库的入口函数,需要在Lua中调用用来注册库函数列表
// 因为Lua是用C语言写的,所以导出函数需要符合C语言调用规范
// 返回值:注册的函数库,其实为一个table
extern "C" int luaopen_hello( lua_State* L )
{
//注册名为hello的函数库
luaL_register( L, "hello", lrLibs );
return 1;
}
看这三个函数
extern "C" int hello(lua_State* L)
这个函数是你往DLL里面注入的函数,其中它的参数是lua_State,这个是在LUA中的栈,它可以接受很多参数,按编号一次提取
比如说lua_tostring(L,1),就是从L中提取第一个元素,相比这个应该不难理解
struct luaL_reg lrLibs[] =
{
{ "hello", hello },
{ NULL, NULL } /* sentinel */
};
这个结构体很有意思,它说明了你在lua中调用函数的明天,“hello”是你在c++中的明天,hello是在lua中的名字
extern
"C" int luaopen_hello( lua_State* L )
{
//注册名为hello的函数库
luaL_register( L, "hello", lrLibs );
return 1;
}
最后一个函数,注册函数在lua中的定义,很简单,你看看就懂,就是把在hello这个dll中的函数给注册了
当然
还有最后一个步骤
3.建一个模块定义文件,在环境配置中说到过,这里先不介绍怎么配置。
A.这个时候要在当前Project下面建立文件,文件后缀为.def的文件。我这里定义的是叫“lua_c.def”的文件。
B.这个文件很简单,首先在文件最上面加上 EXPORTS,然后再将你在C++文件中定义的那个入口函数的函数名加进来就可以了。(就是上面的luaopen_hello)。
这个有必要说明一点,
lua_c.def文件中的应该是
EXPORTS
luaopen_hello
关于luaopen_hello 后面的hello 其实不是一个单独的意思,如果你建立的dll工程不叫hello,那么,就把hello改成那个名字,你可以试试不改会怎么样,容易 让你理解函数的意思,到此为止,基本的构架就完成了,可以去lua中测试一下吧
require("hello");
-- 在C++文件中注册的名字
local f = hello;
-- 调用C++文件中定义的方法,"Lua"就是参数了。
f.hello("Lua");
lua中的代码,这个就不解释了,应该是没问题的
貌似不能添加附件,有问题可以问我邮箱:plyj0123@163.com
引用地址:http://apps.hi.baidu.com/share/detail/30715104
尽管网上类似的例子不少,但是对于很多新手来说,有些问题并没有说的那么详细
直奔主题
在此,我会列出我参考的文章,有些东西就直接复制的
环境:Visual C++ 2008 Express Edition + Lua 1.5 + SciTE(lua编辑器)
下载 Visual C++ 2008 Express Edition + Lua ,下载后安装,省略N字。
环境配置:
1.打开Visual C++ 2008(后面简称VC2008),新建一个C++ project,File->New Project->Empty Project,在Name栏输入工程名,然后OK.
2.设置生成DLL文件,右键工程名,Properties->Configuration Properties->General->Configuration Type->选择Dynamic Library(.dll)
3.设置C/C++、Lua。C/C++->General->Additional Include Directories->选择Lua的安装路径下的include,我Lua安装在"C:\Program Files\Lua",我的完整路径:"C:\Program Files\Lua\5.1\include"。
4.设置Linker:Linker->General->Additional Library Directories->选择Lua安装目录下的lib目录就可以了。我的完整路径:"C:\Program Files\Lua\5.1\lib".
5.设置Input:Input->Additional Dependencies->这里手动输入"lua5.1.lib"就可以了。点击确认。
Test Lua调用C++函数
1.选择Source Files,右键Add->New Item->选择 C++ File(.cpp)->Add->Name栏输入hello->Add。
2.在hello.cpp文件中输入下面Code.
Test Lua调用C++函数
1.选择Source Files,右键Add->New Item->选择 C++ File(.cpp)->Add->Name栏输入hello->Add。
2.在hello.cpp文件中输入下面Code.
//----------依赖文件-----------
//因为建的是C++ Project,所以这里必须要加extern "C" ,如果不加这个是没办法编译的。
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
#include <windows.h>
#include <wincrypt.h>
//因为建的是C++ Project,所以这里必须要加extern "C"
extern "C" int hello(lua_State* L){
printf("------>> Hi! %s \n",(LPTSTR)lua_tostring(L,1));
return 0;
}
//--------注册函数-----------
struct luaL_reg lrLibs[] =
{
{ "hello", hello },
{ NULL, NULL } /* sentinel */
};
// 该函数是库的入口函数,需要在Lua中调用用来注册库函数列表
// 因为Lua是用C语言写的,所以导出函数需要符合C语言调用规范
// 返回值:注册的函数库,其实为一个table
extern "C" int luaopen_hello( lua_State* L )
{
//注册名为hello的函数库
luaL_register( L, "hello", lrLibs );
return 1;
}
看这三个函数
extern "C" int hello(lua_State* L)
这个函数是你往DLL里面注入的函数,其中它的参数是lua_State,这个是在LUA中的栈,它可以接受很多参数,按编号一次提取
比如说lua_tostring(L,1),就是从L中提取第一个元素,相比这个应该不难理解
struct luaL_reg lrLibs[] =
{
{ "hello", hello },
{ NULL, NULL } /* sentinel */
};
这个结构体很有意思,它说明了你在lua中调用函数的明天,“hello”是你在c++中的明天,hello是在lua中的名字
extern
"C" int luaopen_hello( lua_State* L )
{
//注册名为hello的函数库
luaL_register( L, "hello", lrLibs );
return 1;
}
最后一个函数,注册函数在lua中的定义,很简单,你看看就懂,就是把在hello这个dll中的函数给注册了
当然
还有最后一个步骤
3.建一个模块定义文件,在环境配置中说到过,这里先不介绍怎么配置。
A.这个时候要在当前Project下面建立文件,文件后缀为.def的文件。我这里定义的是叫“lua_c.def”的文件。
B.这个文件很简单,首先在文件最上面加上 EXPORTS,然后再将你在C++文件中定义的那个入口函数的函数名加进来就可以了。(就是上面的luaopen_hello)。
这个有必要说明一点,
lua_c.def文件中的应该是
EXPORTS
luaopen_hello
关于luaopen_hello 后面的hello 其实不是一个单独的意思,如果你建立的dll工程不叫hello,那么,就把hello改成那个名字,你可以试试不改会怎么样,容易 让你理解函数的意思,到此为止,基本的构架就完成了,可以去lua中测试一下吧
require("hello");
-- 在C++文件中注册的名字
local f = hello;
-- 调用C++文件中定义的方法,"Lua"就是参数了。
f.hello("Lua");
lua中的代码,这个就不解释了,应该是没问题的
貌似不能添加附件,有问题可以问我邮箱:plyj0123@163.com
引用地址:http://apps.hi.baidu.com/share/detail/30715104
相关文章推荐
- 关于Lua调用c++ DLL 文件的详解
- 关于在C#中调用C++ DLL 时的参数传递
- 本文是关于使用C++调用Matlab编译生成的Dll的说明
- 关于 C# 调用C++ DLL 的思考
- C#中调用DLL时未能加载文件或程序集错误的处理方法(详解)
- C#调用c++封装的dll文件提示未能加载正确的程序集XXX或其某一依赖项。。。
- Java调用dll与C++通讯(包括.dll文件的制作)
- lua调用c++dll 简单案例
- Lua直接调用动态链接库(DLL或so文件)
- MSDN中关于 c# 调用 C++ 非托管 Dll 的主题
- c++中关于dll的调用方法(两种)
- 用C/C++编写与调用动态链接库(DLL)文件
- C++ 编写DLL文件给易语言调用
- C#调用c++dll时,关于回调函数
- 关于“无法显式调用运算符或访问器”的问题以及Reflector反编译dll文件再生成dll文件的问题
- C#调用C++的dll关于复杂结构的参数传递
- Silverlight5通过P/Invoke调用自定义C/C++ DLL(Lua)
- 关于cocos2dx如何绑定c++的静态方法和类给lua调用
- c#调用c++写成的dll文件
- C#调用C++ dll时CallingConvention调用约定详解