lua自定义c模块示例 (VSCode, CLion, VS2017)
项目的所有文件

CMakeLists.txt
cmake_minimum_required(VERSION 3.12.0)
set(Proj_Name "MyLuaLib")
project(${Proj_Name})
message("----- PROJECT_BINARY_DIR: ${PROJECT_BINARY_DIR}")
# 使用的语言标准是C89/ANSI C
set(CMAKE_C_STANDARD 90)
# 设置变量LUA_INCLUDE_DIR, 存放: 头文件搜索文件夹路径
set(LUA_INCLUDE_DIR "C:/Users/win/Documents/_cpp/_lua/xlua_build/lua-5.1.5/src")
# 如果lua的路径添加到Path环境变量上了, find_package时会自动设置到变量LUA_LIBRARY上
find_package(Lua REQUIRED)
# 头文件搜索目录
include_directories(
"include"
${LUA_INCLUDE_DIR}
)
# 遍历src文件夹下的所有源码文件, 存放在变量Src_List上
aux_source_directory("src" Src_List)
# 变量Src_List上再加一个源码文件
set(Src_List ${Src_List} "mylualib.c")
# 定义变量 Target_Name_Lib
set(Target_Name_Lib "mylualib")
# 动态库mylualib包含的源码文件
add_library(${Target_Name_Lib} SHARED ${Src_List})
# 生成的库名字不要有前缀
# set_target_properties(${Target_Name_Lib} PROPERTIES PREFIX "")
# 库文件搜索路径
target_link_libraries(${Target_Name_Lib} ${LUA_LIBRARY})
mylualib.c
#include <lua.h> #include <lauxlib.h> #include "myutil.h" int l_calc(lua_State *L) { lua_Number op1 = luaL_checknumber(L, 1); lua_Number op2 = luaL_checknumber(L, 2); lua_Number result = calc(op1, op2); lua_pushnumber(L, result); return 1; } static const struct luaL_Reg mylibs[] = { {"calc", l_calc}, {NULL, NULL}, }; LUALIB_API int luaopen_MyLuaLib(lua_State *L) { luaL_register(L, "MyLuaLib", mylibs); return 1; }
include/myutil.h
#ifndef MYLUALIB_MYUTIL_H #define MYLUALIB_MYUTIL_H extern double calc(double a, double b); #endif //MYLUALIB_MYUTIL_H
src/myutil.c
#include "myutil.h" double calc(double a, double b) { return a + b; }
用VSCode编译构建项目
1, 菜单 -> File -> Preferences -> Settings -> 点击Workspace页签,设置项目配置 -> Extensions -> C/C++
找到Compiler Path,点击Edit in settings.json(然后会在项目下生成配置文件 MyLuaLib/.vscode/settings.json)
主要是设置编译器路径和头文件搜索路径(注意路径替换为自己电脑上的存放路径)
{ "C_Cpp.default.compilerPath": "C:/_dev/mingw64/bin/g++.exe", "C_Cpp.default.includePath": [ "${workspaceFolder}/include/", "C:/Users/win/Documents/_cpp/_lua/xlua_build/lua-5.1.5/src/" ], }

如果不把头文件搜索路径设置好,#include就会出现下面这样的(不影响编译)


2, 点击Build,就开始生成dll了

3, 生成后会多一个build文件夹,dll文件就在里面

4, 将dll文件拷贝到lua所在文件夹,改名为mylualib.dll

5, 新建一个TestMyLuaLib.lua脚本验证是否可以正常运行
local mylualib = require("MyLuaLib") --名字必须与luaopen_Xxx大小写一致 local result = mylualib.calc(1, 2) print(result)

用Clion编译构建项目
1, 用Clion打开MyLuaLib项目文件夹,他会自动识别出CMakeLists.txt

2, 默认会为我们创建一个Debug配置,Release配置需要自己创建,这边暂时就用默认的

3, 然后根据CMakeLists.txt自动生成Makefile等(CLion是生成在cmake-build-debug下的)

4, 菜单 -> Build -> Build Project来生成dll文件

5, 后面的操作就跟VSCode一样了
用VS2017编译构建项目
1) 新建一个动态链接库项目,这边因为之前这个文件夹创建过,所以会报错。

可以把之前的文件夹先命名为MyLuaLib_2,然后再创建。创建好后,把MyLuaLib_2文件夹里的所有文件移动到MyLuaLib下


2) 删除所有默认创建的文件,这边用不到

然后把mylualib.c, src/myutil.c拖拽到vs的源文件筛选器上,把include/myutil.h拖拽到vs的头文件筛选器上。

3) 右键设置项目属性






4) 生成dll


5, 后面的操作就跟VSCode一样了
vc++注意:
1) vc++下的目录结构和筛选器无关联,要保持和目录结构一致,只能自己创建同名的筛选器才行
2) 包含自己代码的头文件时,默认是相对项目的根目录的,比如头文件在:ProjDir/include/test.h,那就是#include "include/test.h",
如果想#include "test.h",那必须把$(ProjectDir)\include\文件夹在附加包含目录中做设置
参考
mingw 或 msys2 用 gcc 编译 lua - 简书 (jianshu.com)
如何用C/C++生成一个为lua所用的动态库dll文件以及lua如何调用该dll(C语言的动态库)_lua5.4动态链接库-CSDN博客
为Lua5.3编写C模块简单示例 - lsgxeva - 博客园 (cnblogs.com)

浙公网安备 33010602011771号