有我的问题:
所有代码都在C ++ 11中。
我已经构建了一个库(名为socket)。 在代码中,我声明了一个函数:
namespace ntw {
extern int dispatch(int id,Socket& request));
}
这个函数是用户定义的(大多数情况下,只是一个大开关))并且通过这种方式它的主体,没有在套接字lib中定义。
我在server.cpp中使用此函数(它是套接字lib的一部分)。
在linux下一切都很好,它完美地构建了.so。 但是在windows下它会创建一个
undefined reference to ntw::dispatch(int,Socket&)
所以.dll不是构建的。
我创建了使用套接字库的主程序。
在这段代码中,我做了:
namespace ntw {
int dispatch(int id,Socket& request)){
/// some code
return ...;
}
}
所以现在,我想要的是: 用户定义int dispatch(int id,Socket& request))必须由套接字库调用。
在Ubuntu下,一切都很好(coppilation,adn run), 但在窗户下....这是地狱。
我可以做些什么来使它在Windows XP及更高版本下工作?
Ubuntu 12.04,gcc 4.8.1
windows xp,mingw 4.8.1
github:https://github.com/Krozark/cpp-Socket
它使用cmake(如果有人想尝试)。
答案 0 :(得分:2)
您尝试在Windows上工作的内容与Linux的链接模型完全不同。你需要运行时绑定。我想你希望函数由主机可执行文件提供。在这种情况下,您需要主机使用.def文件或__declspec(dllexport)
导出它。然后像这样运行时间绑定:
HMODULE hMod = GetModuleHandle(NULL); // gets host executable module handle
void *fn = GetProcAddress(hMod, FunctionName);
然后,您可以在调用函数之前将fn
强制转换为适当声明的函数指针。
这可能是您的Linux代码运作方式的合理近似值。但它不是一种非常自然的Windows操作方式。更常见的是主机注册回调函数或与库的接口。一旦主机通知库其回调,库就可以使用它们。