Visual Studio 2015无法静态链接Curl

6

我正在尝试使用Visual Studio 2015静态链接一个小的测试curl程序,但是我无法正确地进行链接。

我使用了这个批处理文件来编译curl,它成功地工作了 https://github.com/blackrosezy/build-libcurl-windows

然后我将libcurl目录复制到我的项目目录中,我的代码如下:

 #include "stdafx.h"
 #include "libcurl/include/curl/curl.h"
 #pragma comment(lib, "libcurl/lib/static-debug-x64/libcurl_a_debug.lib")
 #define CURL_STATICLIB


 int main()
 {
    curl_global_init(CURL_GLOBAL_DEFAULT);
    CURL *curl = curl_easy_init();
    if (curl) {
        CURLcode res;
        curl_easy_setopt(curl, CURLOPT_URL, "http://google.com");
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
    }
    curl_global_cleanup();
    printf("Press any key to continue\n");
    getchar();
    return 0;
 }

然而,无论我做什么,都无法使我的链接器停止这样做:

1>CurlTest.obj : error LNK2019: unresolved external symbol __imp_curl_global_init referenced in function main
1>CurlTest.obj : error LNK2019: unresolved external symbol __imp_curl_global_cleanup referenced in function main
1>CurlTest.obj : error LNK2019: unresolved external symbol __imp_curl_easy_init referenced in function main
1>CurlTest.obj : error LNK2019: unresolved external symbol __imp_curl_easy_setopt referenced in function main
1>CurlTest.obj : error LNK2019: unresolved external symbol __imp_curl_easy_perform referenced in function main
1>CurlTest.obj : error LNK2019: unresolved external symbol __imp_curl_easy_cleanup referenced in function main
1>U:\Main\Code\CurlTest\x64\Debug\CurlTest.exe : fatal error LNK1120: 6 unresolved externals

我确认这些路径都是有效的,并尝试使用调试和发布库,以及32位和64位(在Visual Studio中匹配设置)。如果使用非静态库,则可以编译,但这很糟糕,因为我只想分发我的.exe文件而不是dll文件。

我在这里做错了什么?这非常令人沮丧,看起来它只是像一个孩子一样任性,因为从我阅读的类似帖子中得知,#define CURL_STATICLIB指令应该纠正这种行为。


https://dev59.com/R2015IYBdhLWcg3w7wbF - Erik Alapää
那有什么帮助呢?我正在使用Windows和Visual Studio,而不是GCC。 - heidi sievert
链接在WinBloat中的概念应该是类似的。 - Erik Alapää
2个回答

14
#pragma comment(lib, "wldap32.lib" )
#pragma comment(lib, "crypt32.lib" )
#pragma comment(lib, "Ws2_32.lib")

#define CURL_STATICLIB 
#include <curl/curl.h>

这让我成功了。

希望能对你有所帮助,祝好。


1
对我有用。谢谢! - Ricky65
1
也帮助了我,谢谢。 - user3051858
我成功地将 wldap32 crypt32 Ws2_32 添加到 target_link_libraries 中,并且curl已经成功地静态链接。 - CiaranWelsh
等等,我说得太早了。编译没有错误,但实际下载不起作用。我回退到使用共享版本。 - CiaranWelsh

6

我会指导你如何思考这个问题,以补充 Gigi 的回答

  • #define CURL_STATICLIB 是一个预处理器指令。它将影响同一“文件”中出现的代码,且只能影响其后的代码。

  • 预处理器指令不会影响链接的代码。链接是编译过程的一个独立阶段。从本质上讲,请考虑:它不能影响 libcurl.lib。它只能影响“当前文件”。

  • 接下来让我们考虑你的代码。你的代码没有检查 CURL_STATICLIB。但为了进行实验,假设定义 CURL_STATICLIB 将会改变某些东西。

  • 如果这个预处理器指令确实像其他人所建议的那样影响到了某些内容,那么它必须影响通过预处理器包含到这个特定文件中的其他代码。也就是说,它可能会影响到 curl/curl.h 中的某些内容。

简而言之...... 你是否尝试将 #define 移动到 (a) 项目设置或 (b) 刚好位于 #include <curl/curl.h> 的上面?


请注意,<curl/curl.h> 本身就是你的 #include "libcurl/include/curl/curl.h" 的正确表述。如果你以后要在其他平台上构建代码或从可用于平台的共享代码中构建代码,你会希望以“标准”的方式包含你的内容。为可移植性做计划几乎总是一个好习惯。

cURL 的头文件通常会被系统范围内安装(因此使用 <>)到 /usr/include/curl/...(因此使用 curl/...)中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接