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