windows下的extern函数调用使未定义的引用

时间:2014-03-31 13:01:43

标签: c++ windows function extern

有我的问题:

所有代码都在C ++ 11中。

第1部分

我已经构建了一个库(名为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不是构建的。

第2部分

我创建了使用套接字库的主程序。

在这段代码中,我做了:

namespace ntw {
    int dispatch(int id,Socket& request)){
       /// some code
       return ...;
    }
}

finaly

所以现在,我想要的是: 用户定义int dispatch(int id,Socket& request))必须由套接字库调用。

在Ubuntu下,一切都很好(coppilation,adn run), 但在窗户下....这是地狱。

我可以做些什么来使它在Windows XP及更高版本下工作?


的Linux

Ubuntu 12.04,gcc 4.8.1

windows xp,mingw 4.8.1

github:https://github.com/Krozark/cpp-Socket

它使用cmake(如果有人想尝试)。

1 个答案:

答案 0 :(得分:2)

您尝试在Windows上工作的内容与Linux的链接模型完全不同。你需要运行时绑定。我想你希望函数由主机可执行文件提供。在这种情况下,您需要主机使用.def文件或__declspec(dllexport)导出它。然后像这样运行时间绑定:

HMODULE hMod = GetModuleHandle(NULL); // gets host executable module handle
void *fn = GetProcAddress(hMod, FunctionName);

然后,您可以在调用函数之前将fn强制转换为适当声明的函数指针。

这可能是您的Linux代码运作方式的合理近似值。但它不是一种非常自然的Windows操作方式。更常见的是主机注册回调函数或与库的接口。一旦主机通知库其回调,库就可以使用它们。