Как справиться с распространением разделяемых библиотек с разными флагами компиляции? - PullRequest
0 голосов
/ 14 ноября 2018

Я создаю разделяемую библиотеку, которая использует флаги компилятора для загрузки различных оконных менеджеров apis:

-DVK_USE_PLATFORM_WAYLAND_KHR

и

-DVK_USE_PLATFORM_XCB_KHR

Затем приложение компилируется для скомпилированной разделяемой библиотеки сфлаг on wayland или xcb.

Какова стандартная практика распространения и загрузки скомпилированной библиотеки во время выполнения?Должен ли я создавать отдельные двоичные файлы (например, sharedlib.wayland.so и sharedlib.xcb.so), а также отдельные исполняемые файлы (например, app.wayland и app.xcb) для каждого?

1 Ответ

0 голосов
/ 14 ноября 2018

Как я сказал в комментарии, я думаю, что вы действительно хотите принять решение во время выполнения. Но чтобы ответить на вопрос, который вы задали:

Похоже, вы создаете абстрактный интерфейс для любой оконной системы Vulkan и помещаете различные реализации этого интерфейса в свои собственные разделяемые библиотеки. Вы должны по-разному называть библиотеки, например, libvkwsi-wayland.so, libvkwsi-xcb.so.

Обычно люди имеют один исполняемый файл, который решает, какую реализацию использовать, и использует dlopen для загрузки соответствующей разделяемой библиотеки. Затем вам нужно использовать dlsym, чтобы получить указатели на функции в этой библиотеке. Если вы используете C ++ и абстрактный интерфейс является буквальным абстрактным базовым классом, то ваши совместно используемые библиотеки будут иметь одну отдельную функцию, которая создает и возвращает экземпляр класса, производного от этого абстрактного класса. Приложение будет вызывать эту фабричную функцию, и с тех пор может просто вызывать виртуальные функции в объекте, как обычно.

Если вы хотите напрямую ссылаться на разделяемую библиотеку (флаг "-l" во время выполнения исполняемой ссылки), то вам нужно иметь отдельный исполняемый файл для оконной системы (myapp-wayland, myapp-xcb и т. Д.). В этом случае вам, вероятно, также понадобится сценарий оболочки или Python, который выясняет, какую оконную систему использовать, а затем вызывает правильный исполняемый файл - таким образом, вашим пользователям не нужно знать, какую оконную систему им следует использовать ( хорошо для продвинутых пользователей, не так много для большинства людей).

Использование отдельных исполняемых файлов означает, что вы эффективно распределяете несколько копий всего своего приложения, хотя почти все они, вероятно, идентичны между оконными системами.

...