История старая - плагины. Одинаковый интерфейс, разные реализации. Си-ABI, использование в плагинах чего-либо вне возможностей стандартной библиотеки не ожидается.
Разделяемые/динамические библиотеки, подгружаемые во время выполнения работают без проблем.
Но дело в том, что мне нужно иметь возможность включать в стандартную сборку некоторый минимальный набор плагинов, так сказать, то, что доступно по-умолчанию. Набор плагинов, встроенных в бинарник. С одной стороны, это должна быть статическая линковка, с другой - конфликт символов неизбежен. Linux молодец, в Linux есть
objcopy --localize-symbol <symbol> <file>
, так что я успешно смог сделать в отдельном файле функцию-прокси с уникальным именем, слинковать в одну единицу трансляции (
ld --relocate impl1.o proxy1.o -o lib1.o
) и сделать в этом франкенштейне все символы плагина статическими, оставив наружу только уникальное имя прокси.
Я не могу найти, как сделать такое в Windows. Изначально искал, как можно это сделать с помощью CMake, не нашёл, но вдруг кто знает - было бы идеально.
Вопрос: как скрыть от линковщика символы средствами Windows, а лучше CMake? Или как иначе
нужно подходить к этой проблеме и почему только так?
Сразу мои варианты других подходов к проблеме и оправдания, почему не они:
- Существует вариант притащить в винду Linux-стэк в виде каких-нибудь MinGW, Cygwin. Или продать душу clang и использовать llvm-objcopy. Но это дополнительные установки и настройки и не совсем кроссплатформенность, к тому же трудозатратно для разработчика плагина.
- Возможно стоит уйти в кодогенерацию: задекларировать интерфейс и обязать разработчика плагина сообщать, какая функция какой интерфейс реализует. Проблема - наивная надежда, что символы разных разработчиков плагинов будут уникальны.
Спасибо