在openresty中利用lua嵌入C程式
阿新 • • 發佈:2021-02-02
在openresty中利用lua嵌入C程式
兩個前提:
- 已經安裝openresty,若是沒有安裝可以前往https://blog.csdn.net/weixin_43850474/article/details/112860649檢視如何安裝
- 已經學會如何在lua中呼叫C函式,若是不會,可以前往https://blog.csdn.net/weixin_43850474/article/details/112860725學習
一、步驟展示
第一步:編寫C程式,假設其檔案命名為:test.c
該C程式功能很簡單就是連線兩個字串
#include "lua.h" #include "lualib.h" #include "lauxlib.h" #include <stdio.h> #include <string.h> int Strcat(lua_State* L) { char* str1=luaL_checkstring(L,1); char* str2=luaL_checkstring(L,2); strcat(str1,str2); lua_pushstring(L,str1); return 1; } struct luaL_Reg A[]={{"strcat",Strcat},{NULL,NULL}}; int luaopen_test_c(lua_State* L) { luaL_newlib(L,A); return 1; }
至於為什麼如此編寫以及編寫的格式請看開頭第二個網站。
第二步:編寫lua程式,假設將其命名為test_c.lua
local _M={}
function _M.display(str1,str2) local m=require "test.c"
str=m.strcat(str1,str2)
ngx.say("連線結果為:",str)
end
return _M
上面兩步實際上就是在lua中呼叫C函式的步驟,只不過發生了略微的變動。
第三步:將C函式編譯為動態庫
gcc -c -fPIC -o test.o test.c
gcc -shared -o test.so test.o
第四步:配置nginx.conf檔案
worker_processes 1; events { worker_connections 1024; } http { lua_package_path "$prefix/lua/?.lua;;"; server { listen 8080 reuseport; location / { default_type text/plain; content_by_lua_block { 除了下面兩句之外,其餘都是固定的格式,如果想要修改只需要修改下面兩句即可 local t= require "test_c" t.display("hello"," world") } } } }
二、結果展示
三、注意事項(很重要)
如果網頁上出現500的錯誤,有兩種可能:要麼就是你的lua程式碼寫錯了(若是複製的上面的程式碼請忽略),要麼就是你的檔案的位置放錯了。
下面我會針對第二個問題說說如何解決:
第一步:檢視error.log日誌
tail logs/error.log
發現錯誤為:
意思是沒有在這幾個路徑下找到test.so檔案,所以這個時候我們就要將上面編譯完成的.so檔案複製到圖片中的四個路徑中的某一個,我一般是複製到第一個路徑,將.so檔案拷貝到當前目錄中。如此問題解決。