Visual Studio 2015 curl不会静态链接

时间:2017-01-20 11:42:08

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

我正在尝试使用visual studio 2015静态链接一个小的测试卷曲程序,但是我无法正确链接它。

我使用这个批处理文件来编译成功运行的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指令应该纠正这种行为。

2 个答案:

答案 0 :(得分:6)

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

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

这使它适合我。

希望它有所帮助,问候。

答案 1 :(得分:3)

我将引导您完成如何思考,以补充Gigi's answer

  • #define CURL_STATICLIB是预处理程序指令。它会影响同一&#34;文件&#34;中出现的代码,并且只会出现在它之后。

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

  • 让我们接下来考虑您的代码。您的代码不会检查CURL_STATICLIB。但是,为了进行试验,我们假设定义CURL_STATICLIB会改变某些东西。

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

  • 中的某些内容

简而言之...... 您是否尝试将#define移至:(a)项目设置,或(b)#include <curl/curl.h>上方?

请注意,<curl/curl.h>本身就是#include "libcurl/include/curl/curl.h"的正确措词。如果您曾经在其他平台上或通过平台上提供的共享代码构建代码,那么您希望将您的内容包含在“标准”中。办法。计划便携性几乎总是一种好习惯。

cURL的标头通常会在系统范围内安装(因此<>)到/usr/include/curl/...(因此curl/...)。