编译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.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-CSDN博客
lua cURL使用笔记 - lightsong - 博客园
Lua 找不到指定模块 找不到指定的程序 V2 - 萝卜L - 博客园
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验