【问题标题】:C++ Dll linking CurlC++ Dll 链接 Curl
【发布时间】:2014-06-07 15:15:59
【问题描述】:

我正在尝试创建一个 dll,它使用 curl 库来实现一个非常简单的功能。一切正常,唯一的问题是 curl 链接似乎无法正常工作。

我使用相同的链接、预处理器定义和包含目录,就像在我的可执行项目中一样,它工作得很好,所以我很确定这与我的链接或库的二进制文件无关。

是否有任何特殊属性可以将库链接到 dll?

我的最小示例代码:

C++ 主文件:

#include "main.h" 
#include <Windows.h> 
#include <curlpp/cURLpp.hpp>
#include <curlpp/Easy.hpp>
#include <curlpp/Info.hpp>
#include <curlpp/Options.hpp>  
#include <curlpp/Exception.hpp>

namespace CurlDll 
{ 

    void CallHost::Try() 
    { 
        curlpp::Easy request;
        request.setOpt(new curlpp::options::UserAgent("Mozilla/4.0"));
        request.setOpt(new curlpp::options::AutoReferer(true));
        request.setOpt(new curlpp::options::FollowLocation(true));
        request.setOpt(new curlpp::options::Url("http://xml.utrace.de"));
        request.perform();
        MessageBox(0,"lololowwwwwwwwwwwl", "wqgqwwwwwgq", MB_OK |MB_ICONINFORMATION); 
    } 
}   
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason)
{return 1;}

头文件:

#ifdef MAIN_EXPORTS 
#define MAIN_API __declspec(dllexport) 
#else 
#define MAIN_API __declspec(dllimport) 
#endif 
#include <iostream> 


namespace CurlDll 
{ 

    class CallHost 
    { 
    public: 
        static MAIN_API void Try(); 
    }; 
}

我收到以下链接错误@drescherjm (47,我就发几个,我觉得应该够了)

ERROR 2 错误 LNK2001:无法解析的外部符号 “__imp__WSAStartup@8”。

ERROR 11 错误 LNK2001:无法解析的外部符号 “__imp__WSAGetLastError@0”。

ERROR 33 错误 LNK2001:未解析的外部符号 “__imp__setsockopt@20”。

【问题讨论】:

  • 请说得更具体些;当您说“似乎无法正常工作”时 - 您是否收到编译错误、链接器错误、运行时错误?您可以发布您看到的任何错误消息。 EXE应该能够在搜索路径中找到DLL;通常,它们会在同一个文件夹中。
  • Are there any special properties to link a libary to a dll? 确保 DLL 是使用您使用的相同编译器和相同配置编译的。这避免了 CRT 不兼容和超过 1 个堆的任何问题。

标签: c++ dll linker


【解决方案1】:

链接器错误告诉您链接器找不到这些函数的定义:WSAStartup、WSAGetLastError、setsockopt。这些函数在导入库Ws2_32.lib 中定义。您需要将该导入库提供给链接器。

这些信息在函数的文档中给出。例如,WSAStartup 的文档。文档主题的底部是一个列出要求的表格。请注意所需的库,Ws2_32.lib。

【讨论】:

    【解决方案2】:

    符号 WSAStartup、WSAGetLastError 和 setsocketopt 是 Windows API 的一部分,在 Ws2_32.lib 中(例如,参见 http://msdn.microsoft.com/en-gb/library/windows/desktop/ms742213(v=vs.85).aspx)

    链接 DLL 时,您应该将 ws2_32.lib 作为附加库包含在内。如果您使用的是 Visual Studio,很可能搜索路径应该已经找到它;只需将其添加为附加库即可。

    所以实际上,我怀疑你没有使用与 .exe 相比完全相同相同的链接器选项

    如果您正在构建 .exe 或 .dll,链接器需要确保它可以在链接时解析所有已知符号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      相关资源
      最近更新 更多