lua加载动态库

lua加载动态库的注意事项

lua加载的动态库有两种,lua专用的和lua非专用的,专用的是指有luaopen_xxx函数的库,没有的就是非专用的。

对于非专用的,可以调用package.loadlib函数加载,这函数是平台相关的,这里只探讨专用库。

测试项目如下

lua加载动态库_第1张图片

ldll项目为自定义的dll库,lua51为lua源码,main项目是执行程序,还是一个main.lua,会是main函数内加载

ldll,lua51都生成动态库,生成的方法参考:http://blog.csdn.net/arkadia2/article/details/52302050

要注意的是lua51要设置宏LUA_BUILD_AS_DLL,设置方法参考:http://blog.csdn.net/arkadia2/article/details/52084211

设置好各项目的包含文件,引用库(也可以通过项目引用直接设置)

ldll文件下只有init.h和init.cpp

init.h

#ifndef __LDLL_H__
#define __LDLL_H__

#ifdef _DLL_EXPORT_
#define LDLL_API __declspec(dllexport)
#else
#define LDLL_API __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C" {
#endif
#include "lauxlib.h"

LDLL_API int luaopen_ldll(lua_State *L);

#ifdef __cplusplus
};
#endif

#endif // __LDLL_H__

init.cpp

#include 
#include "init.h"


static int version(lua_State *L) {
	lua_pushstring(L, "1.0.0");
	return 1;
}

static int newtb(lua_State *L) {
	lua_newtable(L);
	return 1;
}

static const luaL_Reg ldll_func[] = {
	{"version", version},
	{"newtb", newtb},
	{NULL, NULL},
};

int luaopen_ldll(lua_State *L) { // require("ldll")会调用到这里
	puts("luaopen_ldll");
	luaL_register(L, "ldll", ldll_func);
	return 1;
}
main项目

luaheader.h

#ifndef __LUA_HEADER__
#define __LUA_HEADER__

#ifdef __cplusplus
extern "C" {
#endif
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
#ifdef __cplusplus
};
#endif

#endif
main.cpp

#include 
#include 
#include "luaheader.h"


void LoadMain(lua_State *L) {
	int err = luaL_dofile(L, "main.lua");
	if (err) {
		fprintf(stderr, "%s\n", lua_tostring(L, -1));
		lua_pop(L, 1);
	}
}

int main(int argc, char **argv) {
	lua_State *L = luaL_newstate();
	luaL_openlibs(L);

	LoadMain(L);

	lua_close(L);

	system("pause");
	return EXIT_SUCCESS;
}
最后main.lua

print("main!!")
local ldll = require("ldll")
print(string.format("ldll ver:%s", ldll.version()))
ldll.newtb()
collectgarbage("collect")
print("gc")
运行程序,输出

lua加载动态库_第2张图片

要注意的是lua不支持多个项目静态连接,若上述lua51项目生成静态库而被main和ldll项目引用,则上述例子中执行main.lua的gc时,程序会崩掉。原因是lua里的一些静态变量导至的,可以参考:

https://www.douban.com/note/98782461/

http://blog.codingnow.com/2012/01/lua_link_bug.html


你可能感兴趣的:(lua)