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

6
我有一个应用程序,已经在Windows和Linux之间保持了相对跨平台的稳定性。Cmake和Boost在这方面非常有帮助。
现在是时候连接一个为Windows编写的.dll文件了。如果我能推迟动态链接库的转换,那就是一件好事。其他Windows应用程序像这样连接到此库:
HINSTANCE dll;
dll = LoadLibraryA(filename);
//...
libFuncPtr = (libFuncPtr)GetProcAddress(dll, "libFunc");

我想知道是否有通用的类似功能,或者是时候开始放置系统特定的预处理指令了?目前开发的优先级是Windows平台,我们明白为Linux构建库必须有一个Linux端口,但我希望调用代码尽可能通用。
5个回答

6
开始放弃特定于系统的预处理指令。
你可以编写一个中间接口,提供诸如LoadLib()LoadSym()等函数,调用适当的本机API。换句话说,在为Windows编译时,LoadLib()将使用LoadLibraryA(),而在Linux上它将使用dlopen()
这将使您隐藏代码中的这一丑陋部分,使其更易读。

2
这样的一个好的例子是Qt的QLibrary类,它有一个统一的接口,用于将动态库加载到程序中。
更多细节请参见http://qt-project.org/doc/qt-4.8/qlibrary.html
由于Qt是跨平台的,它可以在任何地方使用。由于Qt是开源的,你可以看一眼它的代码。如果你不需要Qt的其他内容的话,我不建议直接使用它,因为它本身带有很大的链接负担。
我记得过去曾经实现过类似的东西,但代码已经不在了。

1

0

0
如果您可以访问DLL的代码库(听起来是这样),那么一种选择是在Windows上使用隐式链接,以消除对LoadLibraryGetProcAddress的调用。
当您开始将库移植到Linux时,您可以将其构建为静态库,并将应用程序链接到它,以便不需要更改您的代码库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接