如何在/使用 Visual Studio 2010 中为 64 位 Windows 构建 libcurl?
Posted
技术标签:
【中文标题】如何在/使用 Visual Studio 2010 中为 64 位 Windows 构建 libcurl?【英文标题】:How do I build libcurl for 64-bit Windows in/using Visual Studio 2010? 【发布时间】:2016-02-14 22:43:16 【问题描述】:所以最初,我按照BUILD.WINDOWS.txt
的说明进行操作,通过创建一个新文件winbuild.bat
并将其放在我的 curl 文件夹的根目录中,我能够构建 32 位的 libcurl:
CALL "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"
CD winbuild
DEL CURL_OBJS.inc
DEL LIBCURL_OBJS.inc
DEL vc100.idb
nmake /f Makefile.vc mode=dll VC=10 ENABLE_WINSSL=yes GEN_PDB=yes MACHINE=X86
CD ..
EXIT /B 0
然后我从现有代码转到文件/新建/项目.../Visual C++/使用外部构建系统/构建命令行:winbuild.bat。我尝试使用 winbuild64.bat 在我的 x64 属性中创建一个新平台:
CALL "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\x86_amd64\vcvarsx86_amd64.bat"
CD winbuild
DEL CURL_OBJS.inc
DEL LIBCURL_OBJS.inc
DEL vc100.idb
nmake.exe /f Makefile.vc mode=dll VC=10 ENABLE_WINSSL=yes GEN_PDB=yes MACHINE=x64 DEBUG=no
CD ..
EXIT /B 0
但这是我对 winbuild64.bat 的输出:
Setting environment for using Microsoft Visual Studio 2010 x64 tools.
Microsoft (R) Program Maintenance Utility Version 10.00.30319.01
Copyright (C) Microsoft Corporation. All rights reserved.
configuration name: libcurl-vc10-x64-release-dll-ipv6-sspi-winssl
Using SSL:
Using c-ares:
Using SSH2:
Using ZLIB:
Using IDN: true
Using IPv6: true
Using SSPI: true
Using WinSSL: true
CFLAGS: /I. /I ../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL /I"../../deps/include" /DUSE_WIN32_IDN /DWANT_IDN_PRO
TOTYPES /DUSE_IPV6 /DUSE_WINDOWS_SSPI /DUSE_SCHANNEL /Zi /Fd"..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib\libcurl.pdb"
LFLAGS: /nologo /machine:x64 "/LIBPATH:../../deps/lib" /incremental:no /opt:ref,icf
GenPDB: true
Debug: no
Machine: x64
link.exe /DLL ws2_32.lib wldap32.lib advapi32.lib Normaliz.lib /out:..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib\libcurl.dll /IMPLIB:..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib\libcurl.lib /nologo /machine:x64 "/LIBPATH:../../deps/lib" /incremental:no /opt:ref,icf ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/file.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/timeval.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/base64.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/hostip.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/progress.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/formdata.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/cookie.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/http.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/sendf.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/ftp.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/url.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/dict.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/if2ip.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/speedcheck.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/ldap.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/version.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/getenv.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/escape.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/mprintf.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/telnet.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/netrc.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/getinfo.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/transfer.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/strequal.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/easy.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/security.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/curl_fnmatch.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/fileinfo.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/ftplistparser.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/wildcard.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/krb5.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/memdebug.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/http_chunks.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/strtok.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/connect.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/llist.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/hash.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/multi.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/content_encoding.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/share.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/http_digest.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/md4.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/md5.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/http_negotiate.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/inet_pton.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/strtoofft.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/strerror.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/amigaos.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/hostasyn.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/hostip4.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/hostip6.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/hostsyn.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/inet_ntop.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/parsedate.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/select.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/tftp.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/splay.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/strdup.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/socks.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/ssh.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/rawstr.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/curl_addrinfo.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/socks_gssapi.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/socks_sspi.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/curl_sspi.obj..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/slist.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/nonblock.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/curl_memrchr.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/imap.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/pop3.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/smtp.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/pingpong.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/rtsp.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/curl_threads.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/warnless.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/hmac.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/curl_rtmp.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/openldap.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/curl_gethostname.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/gopher.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/idn_win32.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/http_negotiate_sspi.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/http_proxy.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/non-ascii.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/asyn-ares.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/asyn-thread.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/curl_gssapi.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/curl_ntlm.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/curl_ntlm_wb.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/curl_ntlm_core.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/curl_ntlm_msgs.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/curl_sasl.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/curl_multibyte.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/hostcheck.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/conncache.obj..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/pipeline.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/dotdot.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/x509asn1.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/http2.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/curl_sasl_sspi.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/smb.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/curl_sasl_gssapi.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/curl_endian.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/curl_des.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/vtls/openssl.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/vtls/gtls.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/vtls/vtls.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/vtls/nss.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/vtls/polarssl.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/vtls/polarssl_threadlock.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/vtls/axtls.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/vtls/cyassl.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/vtls/schannel.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/vtls/darwinssl.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/vtls/gskit.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/vtls/mbedtls.obj ..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib\libcurl.res
..\builds\libcurl-vc10-x64-release-dll-ipv6-sspi-winssl-obj-lib/file.obj : fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64'
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\amd64\link.exe"' : return code '0x458'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\nmake.exe"' : return code '0x2'
Stop.
我能够在命令提示符中构建 32 位,我尝试了 Visual Studio 命令提示符 (2010) 和 Visual Studio x64 Win64 命令提示符 (2010),但都没有成功。
我已阅读this answer,似乎我可以创建一个项目,然后从 Visual Studio 2010 中运行 nmake,但我不知道如何在编译期间让它在 winbuild 目录中工作。
我的项目中的代码已经完成,我剩下要做的就是构建依赖项以获取用于部署的 dll 和 lib 文件。我一直在调试 libcurl 7.25.0 版本,哈哈,我正在尝试构建 7.47.1。感谢所有帮助。
【问题讨论】:
最简单的方法是转到网页:https://curl.haxx.se/download.html
并下载适合您的 windows 版本的版本。
我需要 libcurl.lib 文件,以便我可以将 libcurl.dll 静态链接到我的项目。
您查看过引用的网站吗?除了许多其他选项之外,还有下载源文件的选项,有 4 种不同的格式可供选择。
相信我,这些档案都没有 .obj 或 .lib 文件,必须构建这些文件。我已经下载了此页面上的所有档案 paehl.com/open_source/?CURL_7.47.1 以及 Win32/64 - Generic 中的其他包。
@user3386109 我在 curl-library 邮件列表上四处询问,现在我可以使用 nmake 为 Windows 构建 curl,但我仍在试图弄清楚如何将 curl 移动到 Visual Studio 2010 以便它与我的项目一起构建。
【参考方案1】:
很简单。 1:安装windows SDK,VS用VC, 2:下载最新的 curl 版本 3:Win+R cmd 4:cd到[你的vs安装]\VC\bin[amd64或x86_amd64],根据你想要的构建类型使用文件夹(我在64位机器上使用amd64在我的64 win 8.1上使用curl dll 5:相应地运行 vcvars64 或 vcvars32 6: cd 到 [提取的 CURL 目录]\winbuild 7:运行: nmake /f makefile.vc ENABLE_WINSSL=yes mode=dll MACHINE=x64 VC=13 根据您的安装使用 x64 和 VC 版本。例如VS 2013 是 13 这将需要一些时间并在 \CURL\builds\libcurl-vc13-x64-release-dll-ipv6-sspi-winssl 或 \CURL\builds\libcurl-vc13-x86-release-dll-ipv6-sspi- 中构建一个 dll胜利
如果 cmd 找不到 nmake,请在系统 PATH 变量中添加: blah blah;bleb, bleh bleh;[你的 VS 安装目录]\VC\bin
确认指定文件夹包含nmake.exe。
【讨论】:
使用您非常有用的答案,我创建了一个 .lib 和一个 .dll,并尝试在 cmake 中同时使用 target_link_libraries。当我尝试在 Visual Studio 中构建项目时,当我使用 .dll 和使用 .lib 时出现文件损坏的错误,我得到未定义的引用错误。由于这些很可能与不包含 .lib 相关,因此我已经仔细检查了这一点,并且包含了 .lib 并且 CURL_STATICLIB 是在预处理器中定义的。你知道可能是什么问题吗? 同样的事情发生在我身上。你找到解决办法了吗?【参考方案2】:1) 点击我在 cmets 中提供的链接
2) 下载所需的 tar 文件
3) 解压tar文件
4) 运行 ./configure
然后 make
然后 make install
(具体细节可能会因您运行的操作系统而略有不同。以上适用于任何 unix 操作系统。)
可以轻松读取包含的 MANUAL
和关联的 README
以及 Makefile
和 GITinfo
文件,以确定每个受支持的操作系统需要输入的确切内容。
【讨论】:
不能在 Windows 上运行 configure,也不能运行 make。等效的是nmake。阅读源tar中的文档winbuild/BUILD.WINDOWS.txt
。
@NobleUplift,我不是提到我给出的序列是针对 unix 的吗?我不是说其他操作系统的细节会有所不同吗?
那么你的答案没有回答问题,特别是在/使用 Visual Studio 2010。
我不是提到了一些细节在不同的操作系统中是不同的吗?正如您所确认的,我不是提到下载的文件包含如何构建库的详细信息吗?以上是关于如何在/使用 Visual Studio 2010 中为 64 位 Windows 构建 libcurl?的主要内容,如果未能解决你的问题,请参考以下文章
在本地运行/调试时如何使用 Visual Studio 2010 配置转换?
使用 Visual C++ 编译器 (Visual Studio 2010) 的可变数组大小出错。如何规避这个问题?
如何在 Visual Studio 2010 中使用 Crystal Reports 创建报表