跨平台动态链接(Windows到Linux)

时间:2012-03-12 21:16:09

标签: c++ dll cross-platform

我有一个应用程序,我已设法在Windows和Linux之间保持合理的跨平台。 Cmake和Boost在这方面的努力是有帮助的。

现在是链接到为Windows编写的.dll的时候了。如果我可以推迟动态链接库的转换,那将是一件好事。其他Windows应用程序连接到此库,如下所示:

HINSTANCE dll;
dll = LoadLibraryA(filename);
//...
libFuncPtr = (libFuncPtr)GetProcAddress(dll, "libFunc");

我想知道这些函数是否有通用类似物,或者是时候开始放入我的系统特定预处理程序指令了?当前的开发优先级是Windows,据了解,必须有一个用于Linux构建的库的Linux端口才能工作,但我希望尽可能保持调用代码的通用性。 / p>

5 个答案:

答案 0 :(得分:6)

  

开始删除系统特定的预处理程序指令。

您可以编写一个中间接口来提供调用aproppriate本机API的LoadLib()LoadSym()等函数。换句话说,在为LoadLib()进行编译时,将使用LoadLibraryA(),在Linux上,它将使用dlopen()

这将让您从主代码中隐藏代码的丑陋部分,使其更具可读性。

答案 1 :(得分:2)

这样一个类的一个很好的例子是Qt的QLibrary,它有一个统一的接口,用于将动态库加载到程序中。

有关详细信息,请参阅http://qt-project.org/doc/qt-4.8/qlibrary.html

由于Qt是跨平台的,因此它可以在任何地方使用。由于Qt是开源的,你可以看看代码。如果你不需要Qt的其他东西,我会直接使用它,因为它自带一个大的连接行李。

我记得过去在这些方面实现了一些东西,但代码早已不复存在。

答案 2 :(得分:1)

您可以使用Poco Shared Library

答案 3 :(得分:0)

如果您可以访问DLL的代码库(听起来像你这样做),那么一个选项是在Windows上使用implicit linking来消除对LoadLibraryGetProcAddress的调用

当您将库移植到Linux时,可以将其构建为静态库并将应用程序与其链接,以便不需要对代码库进行任何更改。

答案 4 :(得分:0)

另一个选择是dlfcn-win32。 https://code.google.com/p/dlfcn-win32/它就像在Linux中一样使用dlopen(),dlsym()和dlclose()