我正在尝试使用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”。
答案 0 :(得分:1)
链接器错误告诉您链接器无法找到这些函数的定义:WSAStartup
,WSAGetLastError
,setsockopt
。这些函数在导入库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,则链接器需要确保它可以在链接时解析所有已知符号。