我正在构建一个共享库,该库使用编译器标志加载不同的窗口管理器api:
-DVK_USE_PLATFORM_WAYLAND_KHR
和
-DVK_USE_PLATFORM_XCB_KHR
然后使用onland或xcb标志针对已编译的共享库编译应用程序。
在运行时分发和加载已编译库的标准做法是什么?我是否应该为每个文件分别生成二进制文件(即sharedlib.wayland.so
和sharedlib.xcb.so
,以及单独的可执行文件(即app.wayland
和app.xcb
)?
答案 0 :(得分:3)
正如我在评论中所说,我认为您实际上是想在运行时决定。但是要回答你问的问题:
看起来您正在做的是为任何Vulkan窗口系统创建一个抽象接口,并将该接口的不同实现放入自己的共享库中。您必须使用不同的名称命名库,例如libvkwsi-wayland.so
,libvkwsi-xcb.so
。
通常,人们将只有一个可执行文件来决定要使用的实现,并使用dlopen
来加载相应的共享库。然后,您需要使用dlsym
获取该库中函数的函数指针。如果您使用的是C ++,并且抽象接口是一个文字抽象基类,则您的共享库将只有一个独立函数,该函数创建并返回从该抽象类派生的类的实例。应用程序将调用该工厂函数,从那时起,就可以像平常一样对对象进行虚拟函数调用。
如果要直接链接到共享库(在可执行链接时为“ -l”标志),则每个窗口系统必须具有单独的可执行文件(myapp-wayland
,myapp-xcb
等) )。在这种情况下,您可能还希望有一个shell或python脚本,找出要使用的窗口系统,然后调用正确的可执行文件-这样,您的用户就不必知道他们应该使用哪种窗口系统(对于高级用户而言很好,对大多数人而言则不然。
使用单独的可执行文件意味着您可以有效地分发整个应用程序的多个副本,即使在窗口系统之间几乎所有的副本都是相同的。