在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文件拷贝到当前目录中。如此问题解决。