Visual Studio 2015 curl不会静态链接

hei*_*ert 2 c++ linker curl visual-studio-2015

我正在尝试使用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;
 }
Run Code Online (Sandbox Code Playgroud)

但无论我做什么,我都无法让我的链接器成长:

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
Run Code Online (Sandbox Code Playgroud)

我已经确认所有这些路径都是有效的,并尝试使用调试和发布库,以及32位和64位(使用visual studio中的匹配设置).这将使用非静态库进行编译,但这是废话,因为我只想分发我的.exe而不是dll.

我在这做错了什么?这非常令人沮丧,看起来它只是幼稚,因为我从类似的线程中读到的#define CURL_STATICLIB指令应该纠正这种行为.

小智 7

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

#define CURL_STATICLIB 
#include <curl/curl.h>
Run Code Online (Sandbox Code Playgroud)

这使它对我有用.

希望它有所帮助,问候.


Iva*_*ica 5

我将指导您如何思考这一点,以补充Gigi 的回答

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

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

  • 接下来让我们考虑您的代码。您的代码碰巧没有检查CURL_STATICLIB. 但是,为了试验,让我们假设定义CURL_STATICLIB会改变一些东西。

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

简而言之......您是否尝试将其移动#define到:(a)项目设置,或(b)就在上面#include <curl/curl.h>


请注意,<curl/curl.h>对于您的#include "libcurl/include/curl/curl.h". 如果您曾经在其他平台上或从某个平台上可用的共享代码构建您的代码,您会希望以“标准”方式包含您的内容。计划可移植性几乎总是一个好习惯。

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