lua自定义c模块示例 (VSCode, CLion, VS2017)
项目的所有文件
CMakeLists.txt
cmake_minimum_required(VERSION 3.10.0) set(Proj_Name "MyLuaLib") project(${Proj_Name}) # 使用的语言标准是C89/ANSI C set(CMAKE_C_STANDARD 90) set(LUA_INCLUDE_DIR "C:/Users/win/Documents/_cpp/_lua/xlua_build/lua-5.1.5/src") # 头文件搜索文件夹 # 如果lua的路径添加到Path环境变量上了, find_package时会自动设置 find_package(Lua REQUIRED) # 头文件搜索目录 include_directories("include" ${LUA_INCLUDE_DIR}) # 源码文件 aux_source_directory("src" Src_List) #遍历src文件夹的所有源码文件, 存放在变量Src_List上 set(Src_List ${Src_List} "mylualib.c") #生成动态库 set(Dll_Name "mylualib") add_library(${Dll_Name} SHARED ${Src_List}) #set_target_properties(${Dll_Name} PROPERTIES PREFIX "") #库名字不要有前缀, 比如:libmylualib.dll target_link_libraries(${Dll_Name} ${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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!