Visual Studio 2013 中的 LibCurl 即使在包含必要的依赖项之后仍会出现静态链接器错误

LibCurl in Visual Studio 2013 Static Linker Errors Even After Including Necessary Dependencies

所以首先我会说我已经看了很多地方都没有成功。

此 PDF 是我开始的地方:
http://curl.haxx.se/libcurl/c/visual_studio.pdf
它似乎已经过时,并且不包括静态 linking 库的说明。或者至少,我已经尝试按照所有说明进行操作,但没有成功。

我试过
中的答案 Installing LibCurl on Visual Studio 2010

Building libcurl library in Visual Studio 2008
和其他领域,但没有取得任何进展。

我还要说,无论怎么想,我都不是 Windows 用户。话虽如此,我将列出到目前为止我所做的事情。

我正在移植我在 Unix 环境中制作的应用程序,具体来说 OSX。除了使用 libcurl 之外,我取得了很多进步。我需要静态地 link LibCurl,以便 Visual Studio 构建的可执行文件可以根据需要移动到其他 Windows 设备,而不需要 libcurl 或 MySQL 的 dll(我也是link正在静态)。

无论如何,在这个存储库的慷慨帮助下:
https://github.com/blackrosezy/build-libcurl-windows
我能够在我的 Windows 设备上构建 libcurl。在我找到这个存储库之前,这是一个艰难的过程。现在我有一个 lib 和一个 include 文件夹。在 lib 文件夹中,有用于 dll 和静态构建的发布和调试文件夹。在静态发布文件夹中,我只有 libcurl_a.lib。在 dll-release 文件夹中,我有 libcurl.dll、libcurl.lib 和 libcurl.pdb.

当从 dll-release 文件夹动态 linking 时,我已经成功构建了程序。但是,当我尝试从 static-release 文件夹静态 link 时,我得到 11 个左右的 linker 错误。

我还包括 "libcurl_a.lib""wldap32.lib""ws2_32.lib""winmm.lib""libeay32.lib""ssleay32.lib" 作为依赖项。

除此之外,我还使用 NuGet 获取了 libssh2.1.4.3.1openssl.1.0.1.21zlib.1.2.8.1 以及所有这些的重新发布版本。我在我的库目录中也包含了以下路径:

path_to_libssh\build\native\lib\v110\Win32\Release\static\cdecl\<br>
path_to_openssl\build\native\lib\v110\Win32\Release\static\cdecl\<br>
path_to_zlib\build\native\lib\v110\Win32\Release\static\cdecl\<br>

我还将这些文件夹的 /include/ 路径放入我的包含目录列表中。

在我的预处理器定义中有 "CURL_STATICLIB".

然而,尽管我从多个来源采取了所有这些步骤,包括本网站上的一些很好的答案,以及 LibCurl 网站上的 PDF 和一些答案,但我仍然遇到这些 linker 错误.

举个例子,我觉得其中一个错误具有轻微的指示性(抱歉,我无法从 VS2013 中复制并粘贴我能分辨的所有这些错误)说:

"error LNK2019: unresolved external symbol curl_easy_setopt referenced in function 'public:__cdecl Curler::Curler(char*)'(??0Curler@@QEAA@PEAD@Z)"

所有这些错误的布局都相似,指向某种 __cdecl Curler 函数,错误代码为 LNK2019.

无论如何,我的问题基本上是:我做错了什么?如果这是一个模糊的问题,或者如果您觉得这是重复的,我很抱歉。但我可以向你保证,我已经查看了大量的 Stack Overflow 问题列表和互联网的其他领域,但都没有成功,我开始感到非常迷茫。似乎对很多其他人有用的东西我就是无法开始工作。我认为很大一部分问题是我对 Windows 的陌生。如果有任何其他信息我可以提供以帮助您帮助我,那么我会很乐意提供。我真的很感激你能给我的任何帮助。谢谢。

首先感谢编辑我的post的用户Pawan;这是我的第一个 post,他帮助它达到了社区的美学标准,所以我知道将来该做什么。

无论如何,我想我的问题已经解决了。这可能有点边缘情况,但无论如何它对我有用。

一段时间后,我决定使用 Visual Studio 为 Win64 构建 libcurl。为此,我从这个有用的存储库中获取了代码:
https://github.com/bagder/curl

我克隆了它,并导航到该目录。然后我 运行 以下命令(这是在 Powershell 中,所以我使用了 unix-esque 命令,但我没有为此使用 MinGW):

mkdir build  
cd build  
cmake .. -G "Visual Studio 12 2013 Win64"

这构建了一个 Visual Studio 解决方案,我可以在 Visual Studio 2013 年打开它。在 Visual Studio,我去了

Project Properties -> C/C++ -> Code Generation

并将 Runtime Library 选项切换为 "Multi-threaded (/MT)"

然后我建了工程,在下面的路径下输出了以下文件:

path_to_pulled_code\build\lib\Release\libcurl.dll
path_to_pulled_code\build\lib\Release\libcurl_imp.exp
path_to_pulled_code\build\lib\Release\libcurl_imp.lib

所以,现在我有了我需要的 lib 文件。现在,在:

Project Properties -> Linker -> Input

我把"libcurl_imp.lib""ws2_32.lib"放在了Additional Dependencies下面。

正如我之前所说,我确保我在 Preprocessor Definitions 中有 "CURL_STATICLIB"。我还为这个项目将 Runtime Library 切换为 "Multi-threaded (/MT)"

毕竟,好吧,它编译了!出于某种原因,我需要将上述 Visual Studio 构建的 bagder 存储库复制 libcurl.dll 到我的可执行路径中,以便解决方案真正起作用。但它似乎至少现在可以工作了!

谢谢大家。希望这个答案能帮助其他像我一样偶然发现这个问题的人。