我有一个应用程序,我已设法在Windows和Linux之间保持合理的跨平台。 Cmake和Boost在这方面的努力是有帮助的。
现在是链接到为Windows编写的.dll的时候了。如果我可以推迟动态链接库的转换,那将是一件好事。其他Windows应用程序连接到此库,如下所示:
HINSTANCE dll;
dll = LoadLibraryA(filename);
//...
libFuncPtr = (libFuncPtr)GetProcAddress(dll, "libFunc");
我想知道这些函数是否有通用类似物,或者是时候开始放入我的系统特定预处理程序指令了?当前的开发优先级是Windows,据了解,必须有一个用于Linux构建的库的Linux端口才能工作,但我希望尽可能保持调用代码的通用性。 / p>
答案 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来消除对LoadLibrary
和GetProcAddress
的调用
当您将库移植到Linux时,可以将其构建为静态库并将应用程序与其链接,以便不需要对代码库进行任何更改。
答案 4 :(得分:0)
另一个选择是dlfcn-win32。 https://code.google.com/p/dlfcn-win32/它就像在Linux中一样使用dlopen(),dlsym()和dlclose()