{"id":148,"date":"2025-10-18T16:20:15","date_gmt":"2025-10-18T08:20:15","guid":{"rendered":"http:\/\/47.99.178.170\/?p=148"},"modified":"2025-10-23T21:53:05","modified_gmt":"2025-10-23T13:53:05","slug":"%e3%80%90%e7%bc%96%e7%a8%8b%e8%af%ad%e8%a8%80%e5%ad%a6%e4%b9%a0%e3%80%91lua%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a12-lua%e8%b0%83%e7%94%a8c","status":"publish","type":"post","link":"https:\/\/www.garfield-blog.top\/?p=148","title":{"rendered":"\u3010\u7f16\u7a0b\u8bed\u8a00\u5b66\u4e60\u3011Lua\u7a0b\u5e8f\u8bbe\u8ba1(2) lua\u8c03\u7528C"},"content":{"rendered":"\n<p><code>Lua<\/code>\u8c03\u7528<code>C<\/code>\u7684\u51e0\u79cd\u4e3b\u6d41\u65b9\u6cd5<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5c01\u88c5\u6210c\u52a8\u6001\u94fe\u63a5\u5e93\uff0c\u5728<code>lua<\/code>\u4e2d<code>require<\/code><\/li>\n\n\n\n<li>\u901a\u8fc7\u5728<code>C<\/code>\u4e2d\u6ce8\u518c\u51fd\u6570\u7ed9<code>lua<\/code>\u8c03\u7528<\/li>\n\n\n\n<li>\u5728<code>LuaJIT<\/code>\u91cc\u9762\u53ef\u4ee5\u4f7f\u7528<code>ffi<\/code>\u9ad8\u6027\u80fd\u7684\u8c03\u7528<code>C<\/code><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">\u8c03\u7528C\u52a8\u6001\u5e93<\/h2>\n\n\n\n<p>\u5c06<code>C<\/code>\u51fd\u6570\u5c01\u88c5\u6210\u52a8\u6001\u5e93\uff0c\u901a\u8fc7<code>luaL_newlib<\/code> \u5c06C \u51fd\u6570\u6253\u5305\u6210\u4e00\u4e2a <code>Lua<\/code> \u6a21\u5757\uff0c\u4ee5\u4f9b <code>Lua<\/code> \u811a\u672c\u4f7f\u7528<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u6587\u4ef6\u5e76\u4fdd\u6301\u683c\u5f0f\u5982\u4e0b<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>.\n|   Makefile\n|   test.lua\n|\n+---inc\n|       luaLib.h\n|\n\\---src\n        cFuntion.c\n        luaLib.c<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6587\u4ef6\u5185\u5bb9\u5982\u4e0b<\/h3>\n\n\n\n<p><strong>test.lua<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>--\u8bbe\u7f6e.so\u641c\u5bfb\u8def\u5f84,\u82e5\u52a8\u6001\u5e93\u4e0elua\u6587\u4ef6\u5728\u540c\u4e00\u76ee\u5f55\u4e0b\u5219\u65e0\u9700\u6307\u5b9a\n--package.cpath = \".\/?.so\" \n\nlocal myLib = require \"mylib\"\nlocal add\n\nmyLib.printDemo()\n\nadd = myLib.addDemo(1, 12)\nprint(add)<\/code><\/pre>\n\n\n\n<p><strong>Makefile<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CC := gcc\nSRCS := $(wildcard .\/src\/*.c)\nOBJS := $(SRCS:.c=.o)\nINC_DIR = -I .\/inc\/\nCFLAGS := -Wall -fPIC\n\n# \u4f7f\u7528 pkg-config \u81ea\u52a8\u63a2\u6d4b LUA_PKG\uff08\u4ecd\u652f\u6301\u5916\u90e8\u8986\u76d6\uff09\nPKG_CONFIG ?= pkg-config\nLUA_CANDIDATES := lua5.4 lua5.3 lua5.2 luajit lua\nLUA_PKG ?= $(firstword $(foreach m,$(LUA_CANDIDATES),$(if $(shell $(PKG_CONFIG) --exists $(m) &amp;&amp; echo yes),$(m))))\nifeq ($(strip $(LUA_PKG)),)\n$(error \u672a\u627e\u5230\u53ef\u7528\u7684 Lua \u5f00\u53d1\u5305\uff0c\u8bf7\u5b89\u88c5 liblua5.x-dev \u6216\u624b\u52a8\u8bbe\u7f6e LUA_PKG=lua5.4 \u7b49)\nendif\n$(info Using LUA_PKG=$(LUA_PKG))\n\nPKG_CFLAGS := $(shell $(PKG_CONFIG) --cflags $(LUA_PKG))\nPKG_LIBS   := $(shell $(PKG_CONFIG) --libs   $(LUA_PKG))\n\nPRODUCT := mylib.so\n\nall: $(PRODUCT)\n\n$(PRODUCT): $(OBJS)\n\t$(CC) -shared -o $@ $^ $(PKG_LIBS)\n\nsrc\/%.o: src\/%.c\n\t$(CC) -c $&lt; -o $@ $(CFLAGS) $(INC_DIR) $(PKG_CFLAGS)\n\n.PHONY: clean\nclean:\n\trm -f $(PRODUCT) $(OBJS)\n<\/code><\/pre>\n\n\n\n<p><strong>luaLib.h<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#ifndef __MYLIB_H__\n#define __MYLIB_H__\n\n#include &lt;lua.h&gt;\n#include &lt;lauxlib.h&gt;\n\nint luaLibAdd(int a, int b);\nint luaLibPrint();\n\n#endif<\/code><\/pre>\n\n\n\n<p><strong>cFunction.c<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h&gt;\n#include \"luaLib.h\"\n \n\/**\n * \u5b9a\u4e49\u5728lua\u4e2d\u53ef\u8c03\u7528\u7684\u51fd\u6570\uff0c\u8981\u9075\u5faa\u89c4\u8303\uff1a\u8fd4\u56de\u503c\u5fc5\u987b\u4e3aint\uff0c\u9700\u4f20\u5165lua_State\n *\/\nint luaLibAdd(int a, int b)\n{\n\treturn a + b;\n}\n\nint luaLibPrint()\n{\n\tchar *str = \"lua calls the C function demo\";\n\tprintf(\"%s\\n\", str);\n\treturn 0;\n}<\/code><\/pre>\n\n\n\n<p><strong>luaLib.c<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h&gt;\n#include \"luaLib.h\"\n \n\/**\n * \u5b9a\u4e49\u5728lua\u4e2d\u53ef\u8c03\u7528\u7684\u51fd\u6570\uff0c\u8981\u9075\u5faa\u89c4\u8303\uff1a\u8fd4\u56de\u503c\u5fc5\u987b\u4e3aint\uff0c\u9700\u4f20\u5165lua_State\n *\/\nint addDemo(lua_State *L)\n{\n\tint num_a = luaL_checkinteger(L, 1);\n\tint num_b = luaL_checkinteger(L, 2);\n\tint num_c;\n\n\tnum_c = luaLibAdd(num_a, num_b);\n\tlua_pushnumber(L, num_c);\n\t\n\treturn 1;\n}\n\nint printDemo(lua_State *L)\n{\n\tluaLibPrint();\n\treturn 0;\n}\n\nint luaopen_mylib(lua_State *L)\n{\n\tluaL_Reg Clib&#91;] = \n\t{\n\t\t{\"addDemo\", addDemo},\n\t\t{\"printDemo\", printDemo},\n\t\t{NULL, NULL}\n\t};\n \n\tluaL_newlib(L, Clib);\n\treturn 1;\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u8fd0\u884c\u7ed3\u679c<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.garfield-blog.top\/wp-content\/uploads\/2025\/10\/lua\u8c03\u7528C\u5e93.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"898\" height=\"245\" data-original=\"https:\/\/www.garfield-blog.top\/wp-content\/uploads\/2025\/10\/lua\u8c03\u7528C\u5e93.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-266\"  sizes=\"auto, (max-width: 898px) 100vw, 898px\" \/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u901a\u8fc7\u5728C\u4e2d\u6ce8\u518c\u51fd\u6570\u7ed9lua\u8c03\u7528<\/h2>\n\n\n\n<p>\u7a0b\u5e8f\u4e3b\u4f53\u5728<code>C<\/code>\u4e2d\u8fd0\u884c\uff0c<code>C<\/code>\u51fd\u6570\u6ce8\u518c\u5230<code>Lua<\/code>\u4e2d\u3002<code>C<\/code>\u8c03\u7528<code>Lua<\/code>\uff0c<code>Lua<\/code>\u8c03\u7528<code>C<\/code>\u6ce8\u518c\u7684\u51fd\u6570\uff0c<code>C<\/code>\u5f97\u5230\u51fd\u6570\u7684\u6267\u884c\u7ed3\u679c<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u6587\u4ef6\u5e76\u4fdd\u6301\u683c\u5f0f\u5982\u4e0b<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>.\n    demo.c\n    Makefile<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6587\u4ef6\u5185\u5bb9\u5982\u4e0b<\/h3>\n\n\n\n<p><strong>demo.c<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;lua.h&gt;\n#include &lt;lauxlib.h&gt;\n#include &lt;lualib.h&gt;\n\nint addDemo(lua_State *L)\n{\n\tint num_a = luaL_checkinteger(L, 1);\n\tint num_b = luaL_checkinteger(L, 2);\n\tint num_c = num_a + num_b;\n\n\tlua_pushnumber(L, num_c);\n\t\n\treturn 1;\n}\n\nint main(void)\n{\n    lua_State *L = luaL_newstate();    \/\/ \u521b\u5efaLua\u72b6\u6001\u673a\u3002\n    luaL_openlibs(L);                  \/\/ \u6253\u5f00Lua\u72b6\u6001\u673a\"L\"\u4e2d\u7684\u6240\u6709Lua\u6807\u51c6\u5e93\u3002\n\n    lua_pushcfunction(L, addDemo);\n    lua_setglobal(L, \"addDemo\");      \/\/ \u5f39\u51fa\u6808\u9876\u5143\u7d20\uff0c\u5e76\u5728Lua\u4e2d\u7528\u540d\u4e3a\"addDemo\"\u7684\u5168\u5c40\u53d8\u91cf\u5b58\u50a8\u3002\n\n    const char* testfunc = \"add = addDemo(1,2);print(\\\"add =\\\",add)\";\n\n    if(luaL_dostring(L, testfunc)) {\n        printf(\"Failed to invoke.\\n\");\n    }\n\n    lua_close(L);    \/\/ \u5173\u95edLua\u72b6\u6001\u673a\u3002\n\n    return 0;\n}<\/code><\/pre>\n\n\n\n<p><strong>Makefile<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CC := gcc\nSRCS := $(wildcard *.c)\nOBJS := $(SRCS:.c=.o)\nCFLAGS := -g -Wall\nPRODUCT := a.out\n\n# \u4f7f\u7528 pkg-config \u81ea\u52a8\u63a2\u6d4b LUA_PKG\uff08\u4ecd\u652f\u6301\u5916\u90e8\u8986\u76d6\uff09\nPKG_CONFIG ?= pkg-config\nLUA_CANDIDATES := lua5.4 lua5.3 lua5.2 luajit lua\nLUA_PKG ?= $(firstword $(foreach m,$(LUA_CANDIDATES),$(if $(shell $(PKG_CONFIG) --exists $(m) &amp;&amp; echo yes),$(m))))\nifeq ($(strip $(LUA_PKG)),)\n$(error \u672a\u627e\u5230\u53ef\u7528\u7684 Lua \u5f00\u53d1\u5305\uff0c\u8bf7\u5b89\u88c5 liblua5.x-dev \u6216\u624b\u52a8\u8bbe\u7f6e LUA_PKG=lua5.4 \u7b49)\nendif\n$(info Using LUA_PKG=$(LUA_PKG))\n\nPKG_CFLAGS := $(shell $(PKG_CONFIG) --cflags $(LUA_PKG))\nPKG_LIBS   := $(shell $(PKG_CONFIG) --libs   $(LUA_PKG))\n\nall: $(PRODUCT)\n\n$(PRODUCT): $(OBJS)\n\t$(CC) -o $@ $^ $(PKG_LIBS)\n\n%.o: %.c\n\t$(CC) -c $&lt; -o $@ $(CFLAGS) $(PKG_CFLAGS)\n\n.PHONY: clean\nclean:\n\t$(RM) -f $(PRODUCT) $(OBJS)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u8fd0\u884c\u7ed3\u679c<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.garfield-blog.top\/wp-content\/uploads\/2025\/10\/C\u4e2d\u6ce8\u518c\u51fd\u6570\u7ed9lua\u8c03\u7528.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"744\" height=\"205\" data-original=\"https:\/\/www.garfield-blog.top\/wp-content\/uploads\/2025\/10\/C\u4e2d\u6ce8\u518c\u51fd\u6570\u7ed9lua\u8c03\u7528.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-265\"\/><\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Lua\u8c03\u7528C\u7684\u51e0\u79cd\u4e3b\u6d41\u65b9\u6cd5 \u8c03\u7528C\u52a8\u6001\u5e93 \u5c06C\u51fd\u6570\u5c01\u88c5\u6210\u52a8\u6001\u5e93\uff0c\u901a\u8fc7luaL_newlib \u5c06C \u51fd\u6570\u6253\u5305\u6210\u4e00 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[7],"tags":[],"class_list":["post-148","post","type-post","status-publish","format-standard","hentry","category-learning-programming-languages"],"_links":{"self":[{"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=\/wp\/v2\/posts\/148","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=148"}],"version-history":[{"count":8,"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=\/wp\/v2\/posts\/148\/revisions"}],"predecessor-version":[{"id":267,"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=\/wp\/v2\/posts\/148\/revisions\/267"}],"wp:attachment":[{"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=148"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=148"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.garfield-blog.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=148"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}