C语言使用libcurl发送HTTP POST JSON请求出现链接错误如何解决
报错原因
你遇到的是链接阶段错误,并非代码逻辑本身有大问题:C语言引入头文件只引入了curl相关函数的声明,函数的具体实现都存在libcurl的库文件中,你编译时没有链接对应的libcurl库,所以链接器找不到所有curl相关函数的实现,就会报undefined reference错误。
另外你的代码里还有一处小问题会导致请求头不生效,下面会一并说明修正方法。
解决步骤
1. 修正编译配置,链接libcurl库
根据你使用的编译工具链调整配置:
- 如果你用MinGW/GCC编译,编译时需要加三个参数:
-I指定curl头文件所在目录,就不用在include里写绝对路径-L指定curl库文件(.a/.dll.a后缀)所在目录-lcurl告诉链接器需要链接libcurl库
示例编译命令:
gcc gpsapi.c -o gpsapi.exe -I"F:\Desktop\myfolder\curl\include" -L"F:\Desktop\myfolder\curl\lib" -lcurl - 如果你用Visual Studio编译,需要修改项目配置:
- 「C/C++ → 常规 → 附加包含目录」添加curl的include文件夹路径
- 「链接器 → 常规 → 附加库目录」添加curl的lib文件夹路径
- 「链接器 → 输入 → 附加依赖项」添加
libcurl.lib;如果是静态编译还需要在预处理器定义里加CURL_STATICLIB宏
2. 修正代码中的请求头赋值bug
curl_slist_append每次调用会返回新的链表头指针,你现在没有把返回值赋值给headers变量,headers会一直保持NULL,所有请求头都不会生效,需要修改为:
struct curl_slist *headers = NULL; headers = curl_slist_append(headers, "Accept: application/json"); headers = curl_slist_append(headers, "Content-Type: application/json"); headers = curl_slist_append(headers, "charset: utf-8");
请求结束后建议补充释放请求头内存的逻辑,在curl_easy_cleanup之前加一行:
curl_slist_free_all(headers);
3. 运行注意事项
如果你是动态链接libcurl,运行生成的exe前需要把对应的libcurl.dll放到exe同目录下,避免运行时报找不到dll的错误。
修正以上配置和代码后,你的POST请求逻辑可以正常运行。
内容的提问来源于stack exchange,提问作者Animeartist
相关产品推荐
相关产品推荐

