编译luacurl
curl
这边下载的是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-CSDN博客
lua cURL使用笔记 - lightsong - 博客园
Lua 找不到指定模块 找不到指定的程序 V2 - 萝卜L - 博客园

浙公网安备 33010602011771号