使用 libcurl 链接程序时未解析的符号

Unresolved symbols when linking a program using libcurl

提问人:Kyle 提问时间:11/14/2010 最后编辑:Gilles 'SO- stop being evil'Kyle 更新时间:6/14/2023 访问量:60090

问:

我知道这是编程问题,但我只是很沮丧地试图弄清楚我做错了什么。

我正在使用 Visual Studio 2010 并按照此处的所有步骤操作: http://curl.haxx.se/libcurl/c/visual_studio.pdf

当我尝试编译我的解决方案时,我不断收到此错误:

1>------ Build started: Project: LibCurl, Configuration: Debug Win32 ------
1>LibCurl.obj : error LNK2019: unresolved external symbol __imp__curl_easy_cleanup referenced in function _main
1>LibCurl.obj : error LNK2019: unresolved external symbol __imp__curl_easy_perform referenced in function _main
1>LibCurl.obj : error LNK2019: unresolved external symbol __imp__curl_easy_setopt referenced in function _main
1>LibCurl.obj : error LNK2019: unresolved external symbol __imp__curl_easy_init referenced in function _main
1>C:\Users\Kyle\Documents\Visual Studio 2010\libcurl\VisualStudio\LibCurl\Debug\LibCurl.exe : fatal error LNK1120: 4 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

源:

// LibCurl.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
  CURL *curl;
  CURLcode res;

  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "http://google.com");
    res = curl_easy_perform(curl);

    /* always cleanup */ 
    curl_easy_cleanup(curl);
  }
  return 0;
}
c visual-studio curl 未解析 - 外部

评论

0赞 Jesse Beder 11/14/2010
确保您从链接的 PDF 中执行了步骤 4.3.2 和 4.3.3。您收到链接器错误,这意味着它未与文件 链接。libcurl.lib
0赞 Kyle 11/14/2010
谢谢杰西。我将以较慢的速度重做这些步骤,看看为什么它没有被链接。感谢您的帮助!

答:

4赞 Willi Ballenthin 11/14/2010 #1

看起来库没有成功链接。确保库目录设置为包含 libcurl dll 的完整路径。此外,请确保此库已实际添加到您的项目中。

评论

3赞 PTT 12/3/2012
您需要包含 libcurl.lib、curllib.lib
109赞 stoiczek 3/24/2011 #2

我一直在使用 libcurl 的静态版本,为了正确地将我的程序链接到它,我必须添加定义:

CURL_STATICLIB

构建我的项目的配置。

评论

15赞 PeterK 10/29/2012
这可能是常见问题之一:如果你使用 libcurl 作为 STATIC 库,你不仅需要在 curl 项目中定义CURL_STATICLIB,还需要在你想使用它的项目中定义它。
0赞 Dmitry Kochkin 2/12/2013
我刚刚遇到的另一个有趣的观点:您可以在主项目中定义它,而忘记在您正在使用的另一个 vcproj 中提及。
3赞 Silver Moon 2/22/2015
非常感谢。转到 VC++ 项目设置 |C++语言 |预处理器并将CURL_STATICLIB添加到预处理器定义中,它就可以工作了
1赞 Rick 6/4/2015
你为我节省了一大堆工作和一堆我本来会拔掉的头发
0赞 triclosan 7/17/2015
它是否仅在 MSVC 上累积?
4赞 tagoma 4/9/2012 #3

我有同样的问题。我在这里写了我如何最终能够使 CurlLib 工作: http://quantcorner.wordpress.com/2012/04/08/using-libcurl-with-visual-c-2010/ 如果你想看看。祝你好运!

6赞 wayne 12/20/2014 #4

我遇到了类似的问题 - 发现我引用了 libcurl.lib 的 64 位位置。将链接目录更改为 32 位位置,并且项目编译完美。

26赞 cdonts 1/25/2016 #5

除了定义,对我来说,还需要链接以下依赖项(包括或):CURL_STATICLIBlibcurl.liblibcurld.lib

  • Ws2_32.lib
  • Wldap32.lib

评论

0赞 T4cC0re 5/31/2017
定义拯救了我的培根!谢谢!CURL_STATICLIB
1赞 Stan 10/16/2020
我还有几个缺少的依赖项,这个答案帮助我 stackoverflow.com/questions/50477484/......
2赞 Zsolti 6/16/2017 #6

经过许多想法和配置,我解决了这个问题,添加了以下内容:

#pragma comment(lib, "lib/libcurl_a.lib")

其中 是 curl lib 文件的名称,是包含该文件的文件夹。libcurl_a.liblib

评论

0赞 Eddz 5/20/2020
谢谢。这对我有用!将其添加到其中一个头文件中。在这种情况下不需要CURL_STATICLIB,顺便说一句,我使用我的自编译版本的 curl 7.70.0 和:curl-7.70.0\winbuild>nmake /f Makefile.vc mode=dll。在这种情况下,请使用:#pragma comment(lib, “lib/libcurl.lib”)
1赞 Rumák 2/26/2021 #7

我有同样的错误,我遇到的问题是我根据这个 SO 答案构建了 cURL,如果您希望 /MT 作为运行时库选项,这不起作用。

为了构建相对于 /MT 和 /MTD 的 cURL,您还必须在同一个控制台中使用命令实际构建它之前执行它。以这种方式构建 cURL 的完整过程可以在这里找到。Set RTLIBCFG=staticnmake

编辑: 如果 URL 停止工作,我也会在这里放置说明:

  • 将 CUrl 源代码下载并解压缩到临时目录。http://curl.haxx.se/download.html,在本教程中,我们将使用 curl-7.37.0
  • 打开“Visual Studio 命令提示符 (2010)”
  • 浏览到 Winbuilds 文件夹。\curl-7.37.0\winbuild。
  • 在命令提示符下键入并按回车键。这会将编译器设置为针对 /MT 和 /MTd 进行生成。Set RTLIBCFG=static
  • 键入以生成调试版本或nmake /f MakeFile.vc mode=static DEBUG=yes
  • 键入以生成发布版本。nmake /f MakeFile.vc mode=static DEBUG=no

评论

0赞 MartinZ 4/29/2022
设置 RTLIBCFG=static 不是一个好主意。' 通常不应使用该选项,nmake 将默认为 DLL CRT。RTLIBCFG很少使用,因此很少测试。
5赞 BigChief 1/4/2022 #8

这在 VS2017 - x86 发布/调试 - MFC 静态库上对我有用

打开项目属性并查看以下内容

  • C/C++ - 预处理器 - 预处理器定义 - 添加CURL_STATICLIB

  • 链接器 - 输入 - 其他依赖项 - 添加 (CTRL+C)

ws2_32.lib

规范化.lib

Crypt32.库

Wldap32.lib

libcurl_a.lib(libcurl_a_debug.lib 用于调试配置)

  • C/C++ - 常规 - 附加包含目录 - 添加包含 文件夹到头文件
0赞 carloselfietro 6/14/2023 #9

我有同样的错误。 问题是我用 32 位构建 libcurl_a.lib,而我的项目是 64 位。 必须使用 64 位托管开发人员命令提示符,而不是 32 位提示符。 因此,您必须使用 Windows 开始菜单中的快捷方式“适用于 VS 2022 的 x64 Native Tools Command Prompt”,而不是通过“VS->Tools->Developer Command Prompt”打开它。 查看 https://learn.microsoft.com/en-us/cpp/build/how-to-enable-a-64-bit-visual-cpp-toolset-on-the-command-line?view=msvc-170