t113-c-curl使用

先复制文件到要用到的项目中

注意:复制.so文件在linux中不可以直接复制粘贴,必须要在linux命令行输入cp到指定的路径才可以,不然只会复制到软链接

改一下cmake

cmake_minimum_required(VERSION 3.12.4)

SET(CMAKE_C_COMPILER /home/momo/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/arm-openwrt-linux-muslgnueabi-gcc)
SET(CMAKE_CXX_COMPILER /home/momo/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/arm-openwrt-linux-muslgnueabi-g++)

project(lcd_lvgl VERSION 1.0)

set(CMAKE_INSTALL_PREFIX /home/momo/Tina-Linux/exsample/youchat/build)
#set(LINK_LIBRARIES "${LINK_LIBRARIES} -lcurl" )

#file(GLOB curlso /home/momo/Tina-Linux/exsample/lcd_lvgl/curl/ *.so)

#包含lvgl的子库

include_directories(/home/momo/Tina-Linux/exsample/youchat/curl)

#创建exe的可执行程序
add_executable(youchat you.c)

#链接所需要的库
set(LINK_DIR /home/momo/Tina-Linux/exsample/youchat/curl)
add_library(curll SHARED IMPORTED)
set_target_properties(
        curll
        PROPERTIES IMPORTED_LOCATION
        ${LINK_DIR}/libcurl.so
)

#link_directories(${LINK_DIR})
target_link_libraries(youchat curll)

这样的写法是这篇文章写的,导入第三方库的教程

https://blog.csdn.net/lftaoyuan/article/details/107057699

cmake_minimum_required(VERSION 3.12.4)

SET(CMAKE_C_COMPILER /home/momo/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/arm-openwrt-linux-muslgnueabi-gcc)
SET(CMAKE_CXX_COMPILER /home/momo/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/arm-openwrt-linux-muslgnueabi-g++)

project(lcd_lvgl VERSION 1.0)

set(CMAKE_INSTALL_PREFIX /home/momo/Tina-Linux/exsample/youchat/build)
#set(LINK_LIBRARIES "${LINK_LIBRARIES} -lcurl" )

#file(GLOB curlso /home/momo/Tina-Linux/exsample/lcd_lvgl/curl/ *.so)

#包含lvgl的子库

include_directories(/home/momo/Tina-Linux/exsample/youchat/curl)

#创建exe的可执行程序
add_executable(youchat you.c)

#链接所需要的库
set(LINK_DIR /home/momo/Tina-Linux/exsample/youchat/curl)
#add_library(curll SHARED IMPORTED)
#set_target_properties(
 #       curll
 #       PROPERTIES IMPORTED_LOCATION
 #       ${LINK_DIR}/libcurl.so
#)

link_directories(${LINK_DIR})
target_link_libraries(youchat libcurl.so)

而这种写法则是在这篇文章学的,但是并没有编译成功,不知道为什么,我觉得应该是cmake没有对库进行解码缓存什么的,那link_directories又是干啥的,这个是在自己做的库中用的但是既然都有缓存了为什么还要这个函数

https://www.jianshu.com/p/354c64b0e26b

最后找到了原因:

cmake_minimum_required(VERSION 3.12.4)

SET(CMAKE_C_COMPILER /home/momo/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/arm-openwrt-linux-muslgnueabi-gcc)
SET(CMAKE_CXX_COMPILER /home/momo/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/arm-openwrt-linux-muslgnueabi-g++)
SET(LINK_DIR /home/momo/Tina-Linux/exsample/youchat/curl)
project(lcd_lvgl VERSION 1.0)

set(CMAKE_INSTALL_PREFIX /home/momo/Tina-Linux/exsample/youchat/build)
#set(LINK_LIBRARIES "${LINK_LIBRARIES} -lcurl" )

#file(GLOB curlso /home/momo/Tina-Linux/exsample/lcd_lvgl/curl/ *.so)

#包含lvgl的子库

link_directories(${LINK_DIR})

include_directories(/home/momo/Tina-Linux/exsample/youchat/curl)

#创建exe的可执行程序
add_executable(youchat you.c)

#链接所需要的库

#add_library(curll SHARED IMPORTED)
#set_target_properties(
 #       curll
 #       PROPERTIES IMPORTED_LOCATION
 #       ${LINK_DIR}/libcurl.so
#)


target_link_libraries(youchat PUBLIC curl)

不知道为什么库文件路径设置必须要在生成可执行文件之前,卡了我半天

那么就可以直接使用了

编程

https://blog.csdn.net/fhncsdn/article/details/120595626#:~:text=libcurl%E5%BA%93%E7%9A%84%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8%201%20%E8%B0%83%E7%94%A8curl_global_init%20%28%29%E5%88%9D%E5%A7%8B%E5%8C%96libcurl%EF%BC%8C%EF%BC%88%E5%B0%B1%E5%83%8F%E5%88%9D%E5%A7%8B%E5%8C%96%E5%A5%97%E6%8E%A5%E5%AD%97%EF%BC%89%202%20%E8%B0%83%E7%94%A8curl_easy_init%20%28%29%E5%87%BD%E6%95%B0%E5%BE%97%E5%88%B0%20easy,%E6%A0%B9%E6%8D%AEcurl_easy_setopt%20%28%29%E8%AE%BE%E7%BD%AE%E7%9A%84%E4%BC%A0%E8%BE%93%E9%80%89%E9%A1%B9%EF%BC%8C%E5%AE%9E%E7%8E%B0%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0%E4%BB%A5%E5%AE%8C%E6%88%90%E7%94%A8%E6%88%B7%E7%89%B9%E5%AE%9A%E4%BB%BB%E5%8A%A1%205%20%E8%B0%83%E7%94%A8curl_easy_perform%20%28%29%E5%87%BD%E6%95%B0%E8%BF%9B%E8%A1%8C%E8%AE%BF%E9%97%AE%E8%AF%B7%E6%B1%82%206%20%E8%B0%83%E7%94%A8curl_easy_cleanup%20%28%29%E9%87%8A%E6%94%BE%E5%86%85%E5%AD%98

流程如下:

调用curl_global_init()初始化libcurl,(就像初始化套接字)
调用curl_easy_init()函数得到 easy interface型指针(这个指针用来各种配置)
调用curl_easy_setopt()设置传输选项(通过调用curl_easy_setopt这个函数来对指针进行各种配置,比如:请求的方式)
根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务
调用curl_easy_perform()函数进行访问请求
调用curl_easy_cleanup()释放内存

需要注意的的是

那么我们直接上手

写一个简单的流程,这个流程未指定输出的时候好像是默认输出到tty的那个上面去的也就是端口,

这个网站我找了半天好不容易才找到个能用的api网站,就不展示出来了要不然又不能用了

结果

如何链接库文件?

https://blog.csdn.net/KYJL888/article/details/85109782

如何转换所得的数据成string

添加funtions之后perferom就行了

https://qastack.cn/programming/2329571/c-libcurl-get-output-into-a-string

使用curl_easy_perform后卡死

我的情况有点特殊,是成功后卡死的,很奇怪,网上找到说是速度的问题,所以设置了速度;

https://blog.csdn.net/xiaoyilong2007101095/article/details/53256966

仍然不行

后面又设置了timeout等都不行,这个好像不关curl的事情但是确实是关掉perform就不见卡死的情况

再不行试一下mutiperfom

找到原因了,之前我一直用的是信号捕获的函数来作为定时器给lvgl计时的,但是这个方法是有风险的,因为这个定时器貌似只能定一个那么如果其他的函数用来结束后关掉就用不了了,当然curl就是这么做的。所以如果想用curl那就必须用tickless模式

 

posted @ 2023-08-16 22:31  悠闲的小莫  阅读(53)  评论(0编辑  收藏  举报