C++ 在windows上使用libcurl,在我的c++;使用visual studio的项目无法工作,因为字符串已损坏

C++ 在windows上使用libcurl,在我的c++;使用visual studio的项目无法工作,因为字符串已损坏,c++,visual-studio-2008,curl,libcurl,C++,Visual Studio 2008,Curl,Libcurl,正如标题中所解释的,我正在尝试使用libcurlcapi提交简单的http查询 我使用Windows作为操作系统,C++作为语言,Visual Studio 2008作为IDE。< /P> 我的代码非常简单: 我想: curlcodeinit=curl\u global\u init(curl\u global\u ALL) 我初始化我的句柄: CURL*handle=CURL\u easy\u init() 我设置url: CRULcode set\u url=curl\u easy\u se

正如标题中所解释的,我正在尝试使用libcurlcapi提交简单的http查询

我使用Windows作为操作系统,C++作为语言,Visual Studio 2008作为IDE。< /P> 我的代码非常简单:

我想:
curlcodeinit=curl\u global\u init(curl\u global\u ALL)

我初始化我的句柄:
CURL*handle=CURL\u easy\u init()

我设置url:
CRULcode set\u url=curl\u easy\u setopt(句柄,CURLOPT\u url,“http://www.example.com“”

我提交我的请求:
CURLcode submit=curl\u easy\u perform(handle)

因此,
init
set\u url
返回代码为0(
CURLE\u OK
),子imt返回代码为2(
CURLE\u url\u格式错误

当我调试时,我意识到我的URL被破坏了,它非但没有被破坏,反而变成了:
xj:
处于发布模式,而
0 |:
处于调试模式。 我一进入
curl\u easy\u setopt

URL字符串肯定已损坏

我的设置中一定有一个错误,因此下面是我的设置摘要(在调试模式下)

  • 在共享DLL中使用MFC
  • 使用多字节字符集
  • 预处理器包括CURL\u STATICLIB
  • 多线程调试DLL/MDd
  • 链接againgst libcurld.lib(版本7.21.3)使用vc6curl.dsw项目编译
  • 还将链接到againgst ws2_32.lib wldap32.lib
“使用vc6curl.dsw项目编译链接到t libcurld.lib(7.21.3版)。

这就是问题所在

静态库必须使用相同的编译器和相同的运行库(/MDd)构建

您可以使用libcurl的DLL版本来避免这种情况。

“使用vc6curl.dsw项目链接againgst libcurld.lib(7.21.3版)编译

这就是问题所在

静态库必须使用相同的编译器和相同的运行库(/MDd)构建


使用DLL版本的libcurl可以避免这种情况。

谢谢您的帮助。我写的简单代码很管用。不过,我还有两个问题。第一个问题是,如果我在有效的URL上调用
curl\u easy\u getinfo
,我仍然会得到和以前一样的垃圾。此外,当我尝试执行更复杂的操作(设置URL并从其他地方执行查询)时,设置URL时会出现错误。在debug中,它在dbgheap.c中崩溃,而在release中,它只是崩溃,抱怨堆损坏。@junes如果将libcurld.lib(debug)与release build链接,或者反之亦然,则可能会发生这些问题。静态库链接有点棘手。如前所述,您必须匹配编译器/编译器版本/编译选项/运行时库版本/运行时库类型。但现在我使用的是dll,在我的链接器输入中,我使用libcurl_imp.lib和libcurld_imp.lib(在调试中)。我发现在windows和visual studio上使用libcurl非常困难…@jules First,
curl\u easy\u getinfo
只有在建立连接并开始传输后才能使用。libcurl在执行之前不会复制输入url,所以在此处设置url调用在那里执行可能会导致内存引用错误。您可以使用静态变量创建一个静态变量来保存url字符串和setinfo url。好的,我明白了。问题是我的URL存储在堆栈中,在执行查询之前超出了范围。在执行查询之前必须存储URL,这有点麻烦。谢谢你的帮助。我写的简单代码很管用。不过,我还有两个问题。第一个问题是,如果我在有效的URL上调用
curl\u easy\u getinfo
,我仍然会得到和以前一样的垃圾。此外,当我尝试执行更复杂的操作(设置URL并从其他地方执行查询)时,设置URL时会出现错误。在debug中,它在dbgheap.c中崩溃,而在release中,它只是崩溃,抱怨堆损坏。@junes如果将libcurld.lib(debug)与release build链接,或者反之亦然,则可能会发生这些问题。静态库链接有点棘手。如前所述,您必须匹配编译器/编译器版本/编译选项/运行时库版本/运行时库类型。但现在我使用的是dll,在我的链接器输入中,我使用libcurl_imp.lib和libcurld_imp.lib(在调试中)。我发现在windows和visual studio上使用libcurl非常困难…@jules First,
curl\u easy\u getinfo
只有在建立连接并开始传输后才能使用。libcurl在执行之前不会复制输入url,所以在此处设置url调用在那里执行可能会导致内存引用错误。您可以使用静态变量创建一个静态变量来保存url字符串和setinfo url。好的,我明白了。问题是我的URL存储在堆栈中,在执行查询之前超出了范围。在执行查询之前必须存储URL,这有点麻烦。谢谢你的帮助。