C ++ Dll链接Curl

时间:2014-06-07 15:15:59

标签: c++ dll linker

我正在尝试使用curl库创建一个非常简单的函数的dll。一切正常,唯一的问题是,卷曲链接似乎不能正常工作。

我使用相同的链接,预处理器定义并包含像我的可执行项目中的目录,它工作正常,所以我很确定它不是关于我的链接或二进制文件的库。

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

我的最小示例代码:

C ++ Mainfile:

#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,我只会发布一些,我认为这样就足够了)

  

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

     

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

     

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

2 个答案:

答案 0 :(得分:1)

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

此信息在功能文档中给出。例如,WSAStartup的文档。文档主题的底部是列出要求的表。请注意所需的库Ws2_32.lib

答案 1 :(得分:1)

符号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,则链接器需要确保它可以在链接时解析所有已知符号。