在openresty中利用lua嵌入C程序

在openresty中利用lua嵌入C程序

两个前提:
  1. 已经安装openresty,若是没有安装可以前往https://blog.csdn.net/weixin_43850474/article/details/112860649查看如何安装
  2. 已经学会如何在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文件拷贝到当前目录中。如此问题解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值