C++调用curl_easy_init()后控制台输出全部消失问题求助
调用curl_easy_init()后控制台输出完全消失的问题及解决
调用curl_easy_init()后,控制台所有输出都消失了——哪怕输出语句写在这个函数调用之前,也看不到任何内容。但只要注释掉curl_easy_init()的调用,程序就能正常输出"Helo"。
代码对比
正常输出的代码
#include <iostream> #include <curl/curl.h> using namespace std; int main(){ std::cout<<"Helo"<<std::endl; CURL *asd; // asd = curl_easy_init(); return 0; }
无输出的代码
#include <iostream> #include <curl/curl.h> using namespace std; int main(){ std::cout<<"Helo"<<std::endl; CURL *asd; asd = curl_easy_init(); return 0; }
运行结果对比
PS C:\Users\Administrator\Desktop\Test> cd "c:\Users\Administrator\Desktop\Test\" ; if ($?) { g++ -std=c++17 test2.cpp sqlite3.o -lcurl -DCURL_STATICLIB -o test2 } ; if ($?) { .\test2 } Helo PS C:\Users\Administrator\Desktop\Test> cd "c:\Users\Administrator\Desktop\Test\" ; if ($?) { g++ -std=c++17 test2.cpp sqlite3.o -lcurl -DCURL_STATICLIB -o test2 } ; if ($?) { .\test2 }
环境信息
- 编辑器:VS Code + Code Runner
- 编译器:MinGW
- curl版本:curl-8.2.0_1-win32-mingw,已将其lib和include目录文件复制到MinGW对应路径
补充编译警告
PS C:\Users\Administrator\Desktop\Test> cd "c:\Users\Administrator\Desktop\Test\" ; if ($?) { g++ -Wall -Wextra -pedantic -O2 -std=c++17 test2.cpp sqlite3.o -lcurl -DCURL_STATICLIB -o test2 } ; if ($?) { .\test2 } test2.cpp: In function 'int main()': test2.cpp:7:11: warning: variable 'asd' set but not used [-Wunused-but-set-variable] CURL *asd; ^~~
解决方法
强制刷新输出缓冲区
curl_easy_init()可能修改了stdio的缓冲策略,手动刷新缓冲区就能解决:std::cout<<"Helo"<<std::endl; std::cout.flush(); // 手动触发输出补全静态链接依赖库
静态链接curl时,Windows下需要额外链接系统库,修改编译命令:g++ -std=c++17 test2.cpp sqlite3.o -lcurl -DCURL_STATICLIB -lws2_32 -lwldap32 -lwinmm -lcrypt32 -o test2显式初始化curl全局环境
虽然curl_easy_init()会自动初始化全局环境,但显式调用能避免隐性问题,同时记得清理资源:int main(){ curl_global_init(CURL_GLOBAL_ALL); std::cout<<"Helo"<<std::endl; CURL *asd = curl_easy_init(); curl_easy_cleanup(asd); curl_global_cleanup(); return 0; }检查位数匹配
确认你的MinGW编译器和下载的curl库位数一致(都是32位或都是64位),位数不匹配会导致各种运行时异常。
内容的提问来源于stack exchange,提问作者top
相关产品推荐
相关产品推荐

