编译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.12.0)

#初始化项目名字
project("luacurl")
message("----- PROJECT_BINARY_DIR: ${PROJECT_BINARY_DIR}")

IF("${CMAKE_CXX_COMPILER_ID}" MATCHES "MSVC")
    # todo
ELSE()
    message("------ CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}") # GNU or Inter or Clang

    # 定义变量 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)
ENDIF()

# 头文件搜索目录
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 @ 2025-02-12 23:50  yanghui01  阅读(80)  评论(0)    收藏  举报