即使包含必要的依赖项后,Visual Studio 2013中的LibCurl静态链接器错误

时间:2015-07-29 15:52:13

标签: c++ visual-c++ visual-studio-2013 libcurl static-linking

首先,我会说我在很多地方都没有成功。

此PDF是我开始的地方:
http://curl.haxx.se/libcurl/c/visual_studio.pdf
它似乎过时了,不包括静态链接库的说明。或者至少,我已经尝试过所有说明而没有任何成功。

我已经尝试过以下答案 Installing LibCurl on Visual Studio 2010
error LNK2019: unresolved external symbol libcurl Visual studio
Building libcurl library in Visual Studio 2008
和其他领域,但没有取得任何进展。

我还会说,在任何想象中我都不是Windows用户。话虽如此,我将列出我到目前为止所做的工作。

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

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

dll-release文件夹动态链接时,我已将程序设置为SUCCESSFULLY构建。但是,当我尝试静态链接静态释放文件夹时,我得到11个左右的链接器错误。

我还包括"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以及所有这些版本的redist版本。我在库目录中也包含了以下路径:

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和一些答案,我仍然有这些链接器错误。

作为一个例子,我觉得其中一个错误是有点指示性的(对不起,我无法复制并粘贴VS2013中的所有这些错误,我可以告诉):

  

&#34;错误LNK2019:未解析的外部符号curl_easy_setopt已引用   in function&#39; public:__ cdecl Curler :: Curler(char *)&#39;(?? 0Curler @@ QEAA @ PEAD @ Z)&#34;

所有这些错误都是类似的,指向某种__cdecl Curler函数,错误代码 LNK2019

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

1 个答案:

答案 0 :(得分:0)

首先,感谢编辑我的帖子的用户Pawan;这是我的第一篇文章,他帮助社区达到了美学标准,所以我知道将来该怎么做。

无论如何,我想我解决了我的问题。这可能是一个边缘案例,但无论如何它对我有用。

过了一会儿,我决定使用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中,我去了

  

项目属性 - &gt; C / C ++ - &gt;代码生成

并将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文件。现在,在:

  

项目属性 - &gt;链接器 - &gt;输入

我将"libcurl_imp.lib""ws2_32.lib"置于Additional Dependencies下。

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

毕竟,好吧,它编译了!出于某种原因,我需要将前面提到的Visual Studio版本的bagder的repo复制libcurl.dll复制到我的可执行路径中,以便解决方案实际工作。但它现在似乎至少在起作用了!

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