未找到符号:OpenSSL_version_num

问题描述

我正在尝试创建一个 kong 插件。作为 kong 服务器的一部分运行时效果很好,但是当我尝试使用 busted 编写一些单元测试时,resty.openssl.digest func 加载失败。更具体地说,在加载 version.lua

我不确定我到底错过了什么。也许是一些应该将 openSSL 的 C 函数链接到 lua 的链接

这是重现问题的最小片段。

package.cpath = package.cpath .. ';/usr/local/lib/lua/5.1/?.so'

local ffi = require("ffi")

ffi.cdef[[
  // 1.0
  unsigned long SSLeay(void);
  const char *SSLeay_version(int t);
  // >= 1.1
  unsigned long OpenSSL_version_num();
  const char *OpenSSL_version(int t);
  // >= 3.0
  const char *OPENSSL_info(int t);
  // BoringSSL
  int BORINGSSL_self_test(void);
]]

local num = ffi.C.OpenSSL_version_num()
print(num)

错误

luajit: test.lua:18: Symbol not found: OpenSSL_version_num
stack traceback:
    [C]: in function '__index'
    test.lua:18: in main chunk
    [C]: at 0x55b71c78ffa4

解决方法

在使用 .so 库中的函数之前,您应该ffi.load

local ffi = require("ffi")
ffi.cdef"long SSLeay(void);"  -- I have ver 1.0
ffi.load("ssl",true)
print(ffi.C.SSLeay())  --> 268439887LL

注意:
package.cpath 仅用于 require()
不影响 FFI 功能。