2016-07-24 15 views
1

Я хочу, чтобы мое приложение Windows могло ссылаться на обширный набор классов и функций, завернутых в DLL, но мне нужно иметь возможность направлять приложение для выбора правильной версии эта DLL перед загрузкой. Я знаком с использованием dllexport/dllimport и созданием библиотек импорта для выполнения динамической компоновки нагрузки, но я не могу найти никакой информации о межсетевых экранах относительно возможности найти какую-либо функцию точки входа в самой библиотеке импорта, поэтому Я могу, в частности, использовать CPUID для определения конфигурации процессора хоста и принять решение о загрузке родительской DLL на основе этой информации. Более конкретно, я хотел бы построить 2 версии DLL, которая построена с помощью/ARCH: AVX и в полной мере использует инструкции SSE-AVX, а другая, которая предполагает, что ничего не доступно более новое, чем SSE2.диспетчеризация библиотеки динамических ссылок времени загрузки

Одно требование: либо DLL должна быть связана во время загрузки, либо должен быть очень простой способ ручного привязки функций, ссылающихся из-за пределов библиотеки DLL, и есть много, в основном, завернутых внутри классов.

Вопрос с бонусом: поскольку мои библиотеки будут межплатформенными, существует ли эквивалент для общих объектов на базе Linux?

+1

Используйте шаблон фабрики, чтобы получить то, что реализацию вы хотите? – wilx

+0

https://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85).aspx – OldProgrammer

+4

Я бы посмотрел на [загруженные с задержкой библиотеки DLL] (https: // msdn. microsoft.com/en-us/library/151kt790.aspx) с пользовательской [вспомогательной функцией] (https://msdn.microsoft.com/en-us/library/09t6x5ds.aspx). Помощник должен иметь возможность определять во время выполнения загрузку DLL. –

ответ

1

Я рекомендую вам избегать динамического разрешения вашей DLL из вашего исполняемого файла, если это вообще возможно, так как это просто усложнит вашу жизнь, тем более что у вас много открытых интерфейсов, и они не являются чистыми C.

Возможные Обход

Создать процесс «Chooser», который представляет необходимый интерфейс для решения которых DLL вам нужно, или, может быть, он даже может определить его автоматически. Пусть этот процесс переместит все DLL-решения в стандартное местоположение (и имя), которое ожидает ваш основной исполняемый файл. Затем запустите процесс выбора вашего основного исполняемого файла; он подберет свою DLL из вашего стандартного местоположения, не зная, какая версия DLL существует. Отсутствие задержки загрузки, отсутствие выигрыша, отсутствие дополнительного кодирования; очень просто.

Если это не вариант для вас, то вот ваши отправные точки для задержки загрузки DLL. Это гораздо более скалистая дорога.

Окно

Linux

+0

Следует отметить, что «возможное обходное решение» не позволяет запускать два экземпляра приложения одновременно с различными вариантами DLL. – dxiv

+0

Хорошая точка, хотя кажется, что OP будет принимать одно и то же решение каждый раз, основываясь на конфигурации машины. В худшем случае вы можете заставить его работать, выбрав chooser exe изменить переменную среды LD_LIBRARY_PATH (и Windows эквивалентную) перед запуском основного исполняемого файла, который укажет на новый каталог, содержащий выбранную DLL; новый каталог будет называться на основе идентификатора процесса или случайного идентификатора. – qexyn

+0

Потенциальные изменения поведения очень, очень маловероятны. Во-первых, вспомогательные функции для загрузки с задержкой [документированы] (https://msdn.microsoft.com/en-us/library/09t6x5ds.aspx). И они изменились только один раз ([Изменения в функции возврата с задержкой DLL с Visual C++ 6.0] (https://msdn.microsoft.com/en-us/library/2b054ds4.aspx)). VC++ 6 отправлен в 1998 году. [Ограничения загрузки DLL-файлов] (https://msdn.microsoft.com/en-us/library/yx1x886y.aspx), вероятно, не являются проблемой для OP. – IInspectable

0

Чтобы добавить в qexyn-х годов ответ, можно имитировать задержку загрузки на Linux, создав небольшую статическую библиотеку-заглушку, которая будет dlopen при первом вызове любой из ее функций и затем перенаправить фактическое выполнение в общую библиотеку.Генерация такой библиотеки заглушки может быть сгенерирована автоматически настраиваемым конкретным проектом сценария или Implib.so:

# Generate stub 
$ gen-implib.py libxyz.so 
# Link it instead of -lxyz 
$ gcc myapp.c libxyz.tramp.S libxyz.init.c