Lua调用C++生成的DLL库

本文参考了某大佬的博客,写得十分详细,推荐!!!

需求:

在之前的求解器中添加了Lua库,使得程序可以在Lua脚本中实现自定义函数功能,考虑到未来可能需要与第三方程序库进行耦合计算,现在想到可以借助Lua脚本,在脚本中调用第三方动态库,以实现其功能的扩展。接下来将要简要记录下Lua中调用第三方库的实现过程。

编译Lua库

在windows平台下,借助mingw编译器进行编译。

首先需要去下载Lua源代码,这里下载的是最新的Lua5.4

在安装路径下进行编译,源码中已经写好了Makefile,可以直接进行编译

mingw32-make mingw
mingw32-make install local

在install目录下得到lua.exe,lua54.dll,liblua.a 等可执行文件,动态库与静态库

C++编写DLL接口

以下给出了一个示例,注释比较详细

cpp2dll.cpp

#include <Windows.h>
#include "lua.hpp"
#include <iostream>
#include <time.h>
#include <cmath> // 函数示例:参数输入顺序
int Lua_printf(lua_State *L)
{
int n = lua_gettop(L); // 判断输入参数个数
switch (n)
{
case 0:
std::cout << "intput Para Number is 0" << std::endl;
break;
default:
std::cout << "intput Para is " << n << std::endl;
int a = 0;
for (int i = 1; i <= n; ++i)
{
a = lua_tonumber(L, i); // 从栈底,向上依次读取数据
std::cout << a << " ";
}
std::cout << std::endl;
break;
};
return n; // 返回n个参数
} int Lua_pow(lua_State *L)
{
int n = lua_gettop(L); // 判断输入参数个数
if (n != 2)
{
std::cout << "intput Para Number is not 2" << std::endl;
return -1;
}
double a, b, temp; a = lua_tonumber(L, 1);
b = lua_tonumber(L, 2); int re = std::pow(a, b);
std::cout << "a=" << a << "|b=" << b << "|re=" << re << std::endl;
// lua_pushstring(L, "re="); // 将返回结果压入栈中
lua_pushnumber(L, re); // 将返回结果压入栈中
// return 2;
return 1;
} // 注册名称与函数的对应关系
static const luaL_Reg name_and_func[]{
{"printf", Lua_printf},
{"pow", Lua_pow},
{NULL, NULL}}; // 注册函数:函数名称"luaopen_xxx",其中,xxx必须是dll的名称,即"xxx.dll"
extern "C"
{
int __declspec(dllexport) luaopen_cpp2dll(lua_State *L)
{
printf("start luaopen_lib\n");
luaL_newlib(L, name_and_func); // 创建一个新表,并将函数入栈
printf("end luaopen_lib\n");
return 1;
}
}

编译DLL

编译时需要链接到Lua生成的静态库,所以g++编译时需要指定lua头文件路径,以及静态库路径,编译命令如下

g++ cpp2dll.cpp -O3 -o cpp2dll.dll -shared -fPIC -I ./lua54/include -L absolute/path/to/lua54/lib -llua54

至此生成得Lua可以识别的动态链接库cpp2dll.dll

Lua中调用DLL

编写如下的Lua脚本

test.lua

local cpp2dll = require("cpp2dll")

cpp2dll.printf()
cpp2dll.printf(0,1,2,3) a=2
b=10
print(a,"^",b,"=",cpp2dll.pow(a,b))
print(b,"^",a,"=",cpp2dll.pow(b,a))

lua.exe 执行test.lua脚本

得到如下输出

cmd$ lua.exe test.lua
start luaopen_lib
end luaopen_lib
intput Para Number is 0
intput Para is 4
0 1 2 3
a=2|b=10|re=1024
2 ^ 10 = 1024.0
a=10|b=2|re=100
10 ^ 2 = 100.0

最后,在Lua脚本中成功调用C++编写的动态链接库

#Lua:Lua调用C++生成的DLL库的更多相关文章

  1. c++调用matlab生成的Dll动态连接库

    点击打开链接http://download.csdn.net/detail/nuptboyzhb/4228429 c++调用matlab生成的Dll动态连接库 实验平台:   matlab 7.0(R ...

  2. C++调用C#生成的DLL文件的各种问题

    C++调用C#生成的DLL文件: 首先选择建立一个C#的类库,然后再按照需求编写需要的函数 之后,对于C++调用过程需要注意的几点: 1.使用#using <....some.dll>指出 ...

  3. php调用C#生成的dll(二)

    根据上一篇博文,php调用c#生成的动态库,运行测试时报Fatal error: Class 'COM' not found in XXXXXXXXX 原因是php.ini中未开启COM组件的应用,解 ...

  4. 示例 - 如何在NodeJS中调用SS生成的DLL

    要想在NodeJS中调用SS生成的DLL, 需要借助EdgeJS. EdgeJS: http://tjanczuk.github.io/edge/ 如果你还不知道如何在SS中生成DLL, 请查看: S ...

  5. C#调用Matlab生成的Dll

    问题描述:最近开发需要调用matlab生成的DLL,在New MWNumericArray 对象的时候报错,提示未将对象引用到对象的实例. 问题分析:因为MWArray.dll是Matlab提供的DL ...

  6. Qt Creator调用VS2008生成的DLL注意事项 good

    问题:生成的dll文件QT无法静态/隐式调用 分析:调用的lib库可能是msvc编译的,而我用Qt调用,Qt默认编译器是minGW,两种编译器生成的函数名不一样,所以调用的时候你要用哪个函数,编译结果 ...

  7. WPF调用C++生成的dll文件(示例)

    注:笔者使用的VS版本为2019.1.打开VS2019,选择文件 -> 新建 -> 项目 2.选择项目 新建项目时选择C++“控制台应用”语言:C++平台:Windows项目类型:空项目 ...

  8. WPF开发的界面调用C++生成的dll文件

    以引用d1.dll为例. [生成d1.dll] 文件——新建——项目——Visual C++——Win32项目,选择DLL,点击Finish.在d1.cpp中添加代码 #include "s ...

  9. Java採用JNI调用VC++生成的dll(Java与C++交互)

    应项目需求,须要android调用java,java再调用C++实现android一个图片匹配的功能,我们作为java组须要和C++和Android进行交互.以下是java和C++採用JNI的方式进行 ...

随机推荐

  1. CMU15445 (Fall 2019) 之 Project#4 - Logging & Recovery 详解

    前言 这是 Fall 2019 的最后一个实验,要求我们实现预写式日志.系统恢复和存档点功能,这三个功能分别对应三个类 LogManager.LogRecovery 和 CheckpointManag ...

  2. Tomcat服务部署及配置

    Tomcat服务部署 1.环境准备 systemctl stop firewalld setenforce 0 2.安装jdk cd /opt 将jdk和tomcat软件包拖入当前目录下进行解压 rp ...

  3. qbxt五一数学Day3

    目录 1. 组合数取模 1. \(n,m\le 200\),\(p\) 任意 2. \(n,m\le 10^6\),\(p\ge 10^9\) 素数 3. \(n,m\le 10^6\),\(p\le ...

  4. 使用Hexo建立一个轻量、简易、高逼格的博客

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_93 在之前的一篇文章中,介绍了如何使用Hugo在三分钟之内建立一个简单的个人博客系统,它是基于go lang的,其实,市面上还有一 ...

  5. Informatica旗下PowerCenter的元数据库解析

    因客户需求,最近重拾Informatica下的PowerCenter产品,主要研究数据血缘关系.从PowerCenter本身来看,它是一个功能非常强大,速率非常高效的一款付费的ETL工具,可以满足各种 ...

  6. 在DELL服务器上安装windows2012 r2服务器系统

    主要过程: 1.准备安装光盘,开启服务器,当出现画面按F10进入服务器自带光盘系统安装向导.(若没有系统光盘,可以用软蝶通刻一个服务系统到+R的光盘).进入后选择设置和安装系统. 2.开始安装前,提示 ...

  7. 优雅退出在Golang中的实现

    背景 为什么需要优雅关停 在Linux下运行我们的go程序,通常有这样2种方式: 前台启动.打开终端,在终端中直接启动某个进程,此时终端被阻塞,按CTRL+C退出程序,可以输入其他命令,关闭终端后程序 ...

  8. 梳理清楚springAOP,轻松面向切面编程

    不知道大家有没有这样的感觉,平时经常说aop,但是对aop中的一些概念还是模糊,总感觉很飘渺,今天来梳理下关于aop的知识. 一.概念 我们知道现在开发都是spring,讲的最多的也是springAO ...

  9. C++ 添加程序图标到我的电脑

    C++ 像我的电脑中 百度网盘的 那图标快捷方式.如何生成的呢?设置程序图标到我的电脑 请看下边代码 就ok了(*^__^*) 嘻嘻-- 类似下图: 大家如果看我下边的不是很清楚,可以下载这个具体工程 ...

  10. 刷题记录:Codeforces Round #724 (Div. 2)

    Codeforces Round #724 (Div. 2) 20210713.网址:https://codeforces.com/contest/1536. div2明显比div3难多了啊-只做了前 ...