【问题标题】:Problem with compiling DLL (CURL library) (Visual Studio)编译 DLL(CURL 库)的问题(Visual Studio)
【发布时间】:2020-10-15 11:21:39
【问题描述】:

我在用 C++ 编译 DLL 时遇到问题。我正在为 HTTP POST 使用 CURL 库。

当我将代码编译为控制台应用程序时,我没有收到编译错误。但同样的代码会出现未解决的外部符号错误。

类似的行:

curl_global_init(CURL_GLOBAL_DEFAULT);

curl = curl_easy_init();

curl_easy_setopt(...);
curl_mime_name(...);

我在使用 dll 时做错了什么?缺少什么?

代码如下:

// dllmain.cpp : Defines the entry point for the DLL application.
#define CURL_STATICLIB
#include "pch.h"
#include "CURL/curl.h"

#pragma comment (lib, "CURL/libcurl_a.lib")

__declspec(dllexport) int httpPOST();

BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

int httpPOST() {
    CURL* curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_DEFAULT);

    curl = curl_easy_init();

    if (curl) {
        curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
        curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
        curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
        struct curl_slist* headers = NULL;
        headers = curl_slist_append(headers, "Cookie: cmslog=1");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_mime* mime;
        curl_mimepart* part;
        mime = curl_mime_init(curl);
        part = curl_mime_addpart(mime);
        curl_mime_name(part, "username");
        curl_mime_data(part, "user", CURL_ZERO_TERMINATED);
        part = curl_mime_addpart(mime);
        curl_mime_name(part, "requestcode");
        curl_mime_data(part, "123456", CURL_ZERO_TERMINATED);
    }
    return 0;
}

httpPOST() 中的代码在控制台应用程序中编译没有问题。

错误是:

错误 LNK2001 无法解析外部符号 __imp__curl_global_init

错误 LNK2001 无法解析外部符号 __imp__curl_easy_init

错误 LNK2001 无法解析外部符号 __imp__curl_easy_setopt

错误 LNK2001 未解析的外部符号 __imp__curl_slist_append

错误 LNK2001 无法解析外部符号 __imp__curl_mime_init

...

Error LNK1120 8 unresolved externals

【问题讨论】:

  • 可以分享一下错误信息吗?
  • 我的水晶球告诉我你没有链接 CURL 库;您正在使用标头进行编译,但是链接时缺少您引用的所有 CURL 内容,因为该库要么丢失,要么从未添加。你确定CURL/libcurl_a.lib是正确的吗?
  • 我添加了错误。 CURL/libcurl_a.lib 是正确的,我又检查了一遍。 @Jean-MarcVolle @WhozCraig
  • 很可能您构建 dll 的方式与构建控制台应用程序的方式不同。你有严格相同的线程/调试选项吗?
  • 错误的库风格。如果实际打算链接 static curl 库,那么您需要在使用项目中定义 CURL_STATICLIB。顺便说一句,这不是很好的标准化,alternative

标签: c++


【解决方案1】:

问题出在#define CURL_STATICLIB 订单中。

正确的顺序是:

#include "pch.h"
#define CURL_STATICLIB
#include "CURL/curl.h"

谢谢大家的帮助。

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    相关资源
    最近更新 更多