Lua导出为外部链接库并使用

TIPS:以下示例使用Lua-5.3.6版本进行介绍,结合VS2022进行演示。

下载安装

下载链接:http://www.lua.org/ftp/

lua跳转链接 lua外链_dlc动态链接库

lua跳转链接 lua外链_c语言_02

压缩包内容如下:

lua跳转链接 lua外链_lua跳转链接_03

紧接着,使用VS2022创建一个Windows桌面向导,将Lua源码压缩包内部src文件的源代码文件拷贝至VS2022创建的项目中,具体步骤如下:

lua跳转链接 lua外链_lua跳转链接_04

lua跳转链接 lua外链_c语言_05


lua跳转链接 lua外链_c语言_06

将Lua源文件中str文件夹下除Makefile和luac.c文件外所有文件复制进入Project1项目路径下。

关于为何去除luac.c文件,可参考:

src文件夹:

lua跳转链接 lua外链_c语言_07

Project1项目文件:

lua跳转链接 lua外链_lua_08

然后进入VS2022中,添加现有项(将所有.h和.c文件都加入)。

lua跳转链接 lua外链_lua跳转链接_09


如下:

lua跳转链接 lua外链_dlc动态链接库_10

luaconf.h

  打开luaconf.h文件,找到第244行,如下

lua跳转链接 lua外链_C++_11

  赋值上述红框中的宏,添加至项目–>属性–>C/C+±->预处理器–>预处理器定义中。然后点击应用即可。

lua跳转链接 lua外链_lua跳转链接_12


lua跳转链接 lua外链_c语言_13


lua跳转链接 lua外链_dlc动态链接库_14

结果如下:

lua跳转链接 lua外链_lua跳转链接_15

接下来,配置一下项目的输出目录和中间目录,配置步骤请参考如下链接(路径相同):

最后,右键项目生成,即可导出相应的dll库和lib库。

lua跳转链接 lua外链_c语言_16


lua跳转链接 lua外链_lua跳转链接_17

Lua外部链接库的应用

  在原有解决方案的基础上,重新添加一个项目,如下:

lua跳转链接 lua外链_lua跳转链接_18

  新建一个C++空项目,如下:

lua跳转链接 lua外链_lua跳转链接_19


lua跳转链接 lua外链_dlc动态链接库_20


lua跳转链接 lua外链_dlc动态链接库_21

同时配置一下输出目录和中间目录,同上。

导入文件并执行

  将如下文件从Project1项目导入Project2项目中,如下:

lua跳转链接 lua外链_C++_22


lua跳转链接 lua外链_lua跳转链接_23


lua跳转链接 lua外链_dlc动态链接库_24

  接下来将上述文件在Project2项目中添加现有项。

lua跳转链接 lua外链_lua_25

  紧接着,新建一个main.cpp执行文件,同时代码如下:

TIPS:关于以下C/C++与Lua的交互可以参考博主的Lua模块部分内容,这里不进行细述。

#include <stdio.h>
#include <stdlib.h>
#include "lua.hpp"

#pragma comment(lib,"Project1.lib")//引入lib库文件,需要配置附加库目录,下文进行简述。


extern "C" {
	// 一个Lua函数的标准模型
	LUALIB_API int lua_TestFunc(lua_State* L)
	{
		int top = lua_gettop(L);
		const char* str = luaL_checkstring(L, 1);
		int num = luaL_checkinteger(L, 2);
		top = lua_gettop(L);
		printf("lua调用C函数 %d  %s  %d\n", top, str, num);

		lua_pushstring(L, "Hello World");
		lua_pushnumber(L, 123);
		// 表示有2个返回值
		return 2;
	}
}

int main(int argc, char** argv) {
	lua_State* L = luaL_newstate();  /* create state */

	luaL_openlibs(L);

	// 注册函数
	// 缺点:注册的函数为全局函数
	lua_register(L, "testFunc", lua_TestFunc);

	// 运行一个lua文件或者说加载一个lua文件
	int nRet = luaL_dofile(L, "test.lua");
	luaL_dostring(L, "print('Hello Lua string')");
	luaL_dostring(L, "print(10+20*30)");

	printf("===%d===\n", lua_gettop(L));

	lua_getglobal(L, "gg");
	int num = lua_tonumber(L, 1);
	printf("%d===\n", num);

	printf("===%d===\n", lua_gettop(L));
	lua_pop(L, 1);
	printf("===%d===\n", lua_gettop(L));
	// 执行完成后关闭lua虚拟机
	lua_close(L);
	return EXIT_SUCCESS;
}

test.lua

--test.lua
print("Hello Lua")

function func()
    -- return 1, 2, 3, 4

    local a, d = testFunc("string", 333)
    print(a, d)
end

-- local a,_,_,d = func()

-- print(a,d)

-- local a, d = testFunc("string", 333)
-- local a, d = testFunc()
-- print(a, d)
-- print(type(a),type(d))
func()

gg = 33333

$(SolutionDir)…/bin/$(Platform)$(Configuration)路径下(即为输出目录,与上文配置的输出目录路径相同),我们需要对Project2–>右键属性–>链接器–>常规–>附加库目录进行配置,如下:

lua跳转链接 lua外链_C++_26

  点击应用即可。

注意点

务必更改启动项目,将Project2设置为启动项目,否则会出现如下情况。

lua跳转链接 lua外链_lua_27

运行结果

lua跳转链接 lua外链_lua跳转链接_28