Могут ли несколько версий одной (Boost) DLL сосуществовать в одном процессе? - PullRequest
8 голосов
/ 27 марта 2009

Мое (C ++, кроссплатформенное) приложение активно использует библиотеки Boost (скажем, версия 1.x), и я хочу также связать сам SDK стороннего производителя (поставщика) (без источника) используя Boost (но версия 1.y).

Итак, мы оба динамически связываемся с нашей собственной версией Boost DLL, CRT идентична. Следовательно, во время выполнения мое приложение должно было бы загрузить обе библиотеки DLL Boost 1.x & 1.y.

Каковы потенциальные проблемы и ошибки, связанные с этим?

Я не могу изменить SDK поставщика, но я могу изменить свое приложение. Может быть, я должен попытаться статически связать мой Boost 1.x?

PS: Имя DLL Boost включает их версию, поэтому нет конфликта имен, оба идентифицируемы. Не обычный DLL-ад.

Ответы [ 3 ]

2 голосов
/ 27 марта 2009

Что касается использования DLL для разных версий, проблем не должно быть. По крайней мере, не в Windows.

Это верно, если SDK использует внутреннее повышение. Если SDK использует конструкции Boost в своем интерфейсе, например: у него есть функция, которая возвращает boost :: необязательный, тогда наличие нескольких версий может вызвать проблемы. Это все еще может работать нормально, в зависимости от изменений между версиями, но это определенно будет рискованно. Я не знаю ни одного хорошего решения в этом случае. Это также верно, если вы включаете файл заголовка SDK, который включает файл заголовка повышения.

2 голосов
/ 27 марта 2009

Это большая проблема. Сделай поиск по DLL ад.

Обычно DLL (или общие библиотеки в Linux) загружаются, но не все имена разрешаются во время загрузки. Происходит ленивая оценка, поэтому имена оцениваются при первом использовании. Проблема в том, что если 2 dll имеют одно и то же имя, то местоположение, в котором разрешается имя, зависит от того, в каком порядке выполняется поиск DLL (что зависит от порядка загрузки).

Если вы статически связываете, то у вас не будет проблем с вызовами методов, так как все они будут решены во время компиляции, а сторонние будут разрешены во время выполнения из DLL. Но как насчет структур, которые создаются бустом версии 1? Если вы затем передадите их сторонней библиотеке, которая затем передаст ее бусту версии-x. Структуры выложены одинаково?

Это очень сложная область, и когда возникают проблемы, ее очень трудно отладить. Поэтому попробуйте использовать ту же версию.

0 голосов
/ 27 марта 2009

Если вы напишите функцию foo и экспортируете ее из F.dll, а другую функцию foo, экспортированную из G.dll, будете ли вы ожидать проблем?

Когда AF.exe связан, компоновщику говорят: поместите туда код, который загружает адрес функции foo из F.dll. Теперь BG.dll связан с получением адреса foo из G.dll. Я до сих пор не вижу проблем.

Теперь замените AF.exe вашим приложением, BG.dll - приложением вашего поставщика, F.dll - улучшенной версией, G.dll - улучшенной версией поставщика.

Заключение: я не вижу проблем, если имена dll отличаются.

...