【问题标题】:Visual Studio 2015 curl will not statically linkVisual Studio 2015 curl 不会静态链接
【发布时间】:2017-06-05 09:29:49
【问题描述】:

我正在尝试使用 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 指令应该纠正这种行为的内容看来,这看起来很幼稚。

【问题讨论】:

标签: c++ curl visual-studio-2015 linker


【解决方案1】:
#pragma comment(lib, "wldap32.lib" )
#pragma comment(lib, "crypt32.lib" )
#pragma comment(lib, "Ws2_32.lib")

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

这使它对我有用。

希望对你有帮助,问候。

【讨论】:

  • 为我工作。谢谢!
  • 也帮助了我,谢谢。
  • 我能够将wldap32 crypt32 Ws2_32 添加到target_link_libraries 并成功静态链接卷曲。
  • 等等,我说得太早了。我编译没有错误,但实际下载不起作用。我恢复使用共享版本
【解决方案2】:

我将指导您如何思考这一点,以补充 Gigi's answer

  • #define CURL_STATICLIB 是预处理器指令。它会影响存在于同一个“文件”中的代码,并且只出现在它之后。

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

  • 接下来让我们考虑一下您的代码。您的代码碰巧没有检查CURL_STATICLIB。但是,为了进行实验,我们假设定义 CURL_STATICLIB 会有所改变。

  • 如果这个预处理器指令真的像其他人建议的那样影响某些东西,那么它一定是它影响了通过预处理器进入这个特定文件的其他代码 #included。也就是说,它可能会影响curl/curl.h 中的某些内容。

简而言之...您是否尝试过将 #define 移动到:(a) 项目设置,或 (b) 就在 #include &lt;curl/curl.h&gt; 上方?


请注意,&lt;curl/curl.h&gt; 本身就是您的#include "libcurl/include/curl/curl.h" 的正确措辞。如果您曾经在其他平台上或从平台上可用的共享代码构建代码,您会希望以“标准”方式包含您的内容。规划可移植性几乎总是一种好习惯。

cURL 的标头通常会在系统范围内(因此是 &lt;&gt;)安装到 /usr/include/curl/...(因此是 curl/...)中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多