编译luacurl

curl

  curl - Download

  这边下载的是MinGW的预编译库

  

  解压文件

  

 

lua5.1库

  参考这边:lua包管理器luarocks使用

  

luacurl

  GitHub - alekmarinov/luacurl: Binds libCURL to Lua, 下载源码并解压

  

 

  修改CMakeLists.txt

  注意:curl要用libcurl.dll.a这个静态库,不能用libcurl.a,对外接口全在libcurl.dll.a中

复制代码
cmake_minimum_required(VERSION 3.10.0)

#初始化项目名字
project("luacurl")

# 定义变量 LUA_LIB_DIR
set(LUA_LIB_DIR "c:/_softs/lua-5.1.5_Win64_dllw6_lib")

# 找lua5.1库, 路径存放在变量LIB_LUA上
FIND_LIBRARY(LIB_LUA lua5.1 PATHS
    ${LUA_LIB_DIR}
)
IF(NOT LIB_LUA)
    set(LIB_LUA "${LUA_LIB_DIR}/liblua5.1.a")
ENDIF(NOT LIB_LUA)

# 定义变量 CURL_DIR
set(CURL_DIR "c:/_softs/curl-8.12.0_1-win64-mingw")

# 找curl库, 路径存放在变量LIB_CURL上
FIND_LIBRARY(LIB_CURL libcurl.dll.a PATHS
    "${CURL_DIR}/lib"
)
IF(NOT LIB_CURL)
    set(LIB_CURL "${CURL_DIR}/lib/libcurl.dll.a")
ENDIF(NOT LIB_CURL)

# 头文件搜索目录
INCLUDE_DIRECTORIES(
    "${CURL_DIR}/include"
    "${LUA_LIB_DIR}/include"
)

# 定义变量 Target_Name_Lib
SET(Target_Name_Lib "luacurl")
# 创建动态库luacurl
ADD_LIBRARY(${Target_Name_Lib} SHARED "luacurl.c")
# 库文件搜索路径
TARGET_LINK_LIBRARIES(${Target_Name_Lib} ${LIB_LUA} ${LIB_CURL})
# 设置库名字不要有前缀lib
set_target_properties(${Target_Name_Lib} PROPERTIES PREFIX "")
复制代码

 

用MinGW编译

点Configure设置为MinGW,再点击Generate

  

  生成好后

  

  命令行,进入build文件夹,输入mingw32-make进行编译,会遇到一个编译错误

  

  原因:在8.x中,这两个宏的值相同,所以我们注释掉其中一个就可以编译了。注意:最后面的\还要保留,不然之后的OPT_Xxx会在lua没法访问

  

  还有一个地方要把v.nval改为v.ptr,不然Win64系统上没法在lua使用obj:setopt(curl.OPT_WRITEFUNCTION, function(tab, str) end);

  原因:Win64系统上指针变量占8个字节,int占4个字节,这边会用到函数指针

  

 

  编译成功后生成的文件

  

 

lua中使用curl

  创建测试脚本:./temp.lua

复制代码
package.cpath = package.cpath..";./build/?.dll"

local function TestCurl()
    local curl = require("luacurl")

    local respData = {}
    local c = curl.new()
    c:setopt(curl.OPT_URL, "http://httpbin.org/get")
    c:setopt(curl.OPT_WRITEDATA, respData);
    c:setopt(curl.OPT_WRITEFUNCTION, function(tab, str)
        if tab then --就是curl.OPT_WRITEDATA设置的对象
            table.insert(tab, str)
        end
        return #str
    end);
    local isOk, err = c:perform()
    print("result", isOk, err, table.concat(respData))
    c:close()
end

TestCurl()
复制代码

  运行脚本,有报错

  原因:luacurl.dll加载到了,但libcurl的dll没加载到(curl虽然是以静态库的方式链接的,但并不是完全自包含的,会依赖curl动态库)

  

  解决办法:把curl预编译库下的libcurl-x64.dll拷贝到当前运行目录(或lua程序目录也行)

  还有一种办法就是不使用curl的预编译库,而是自己编译curl,直接编译到luacurl.dll中,这种方式请自己尝试。

  

  

  运行结果

  

 

参考

lua脚本中使用luacurl的几个问题 - 海旭 - 博客园

优化Lua-cURL:减少网络请求延迟的实用方法 - 知乎

Lua-curl库做数据抓取代码示例_lua curl-CSDN博客

lua cURL使用笔记 - lightsong - 博客园

LuaCURL - BIGSING - 博客园 

Lua 找不到指定模块 找不到指定的程序 V2 - 萝卜L - 博客园

 

posted @   yanghui01  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
点击右上角即可分享
微信分享提示