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)

Lua 调用 C 模块中的函数-CSDN博客

如何用C/C++生成一个为lua所用的动态库dll文件以及lua如何调用该dll(C语言的动态库)_lua5.4动态链接库-CSDN博客 

为Lua5.3编写C模块简单示例 - lsgxeva - 博客园 (cnblogs.com)

 

posted @   yanghui01  阅读(122)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示