У нас есть исполняемый проект, который загружает файлы DLL во время выполнения в виде плагинов.
Мы пытаемся создать новый подключаемый модуль, который имеет множество зависимостей от библиотек, и некоторые из этих зависимостей представляют собой одну и ту же библиотеку, но разные версии, на которые ссылаются другие подключаемые модули.
Поскольку от библиотек зависят разные плагины в разных версиях, я хотел бы статически связать/встроить любые зависимости в новый плагин, чтобы они не конфликтовали со старыми зависимостями плагина. Насколько я знаю, ничего в зависимостях плагина не нужно экспортировать, они просто используются плагином.
Можно ли сделать это?
Я пытался собрать все статические библиотеки в Visual Studio как статические библиотеки со средой выполнения, установленной на Многопоточность DLL с флагом /MD, но когда я пытаюсь собрать dynamiclibB.dll, я получаю ошибки компоновщика. Если я настрою dynamiclibB для сборки как статическую библиотеку, у нее не будет ошибок компоновщика.
Я еще не пытался связать newplugin.dll со статической библиотечной версией dynamiclibB, но я думаю, что у меня точно такая же ситуация, поэтому я не вижу причин, по которым она будет работать там, где она не опускается на один уровень ниже.
В любом случае я не хочу собирать dynamiclibB как статическую библиотеку, так как было бы хорошо иметь возможность обновлять newplugin.dll без включения dynamiclibB.dll, если она не была изменена, например, чтобы отделить процесс обновления. Эта цепочка рассуждений предполагает, что у меня должны быть .dll для всего, но я думаю, что конфликты версий меня беспокоят.
Я не могу создавать плагины как статические библиотеки, так как их нужно загружать во время выполнения.
Абсолютно все сейчас создается в режиме релиза, чтобы избежать этого осложнения.
Что мне не хватает?
Попытка диаграммы, которая может помочь понять ситуацию:
program.exe
|
________________
| |
oldplugin.dll newplugin.dll
| |
dynamiclibA.dll dynamiclibB.dll
|
_________________________
| | |
staticlibA.lib slibC.lib slibD.lib
Обновление: предоставление дополнительной информации теперь, когда я знаю, что происходит, и знаю, что более конкретные детали действительно важны. Таким образом, библиотека A, представленная dynamiclibA и staticlibA, была zlib. Библиотекой, которую мы компилировали (dynamiclibB) для использования в новом плагине, была PoDoFo. Сообщения об ошибках, которые мы получили, были:
Error 19 error LNK2001: unresolved external symbol
_deflateInit_ E:\Work\podofo_bin\src\PdfFiltersPrivate.obj podofo_shared Error 20 error LNK2001: unresolved external symbol
_inflateEnd E:\Work\podofo_bin\src\PdfFiltersPrivate.obj podofo_shared Error 21 error LNK2001: unresolved external symbol
_inflateEnd E:\Work\podofo_bin\src\libpng16.lib(pngread.obj) podofo_shared Error 22 error LNK2001: unresolved external symbol
_deflate E:\Work\podofo_bin\src\PdfFiltersPrivate.obj podofo_shared Error 23 error LNK2001: unresolved external symbol
_deflate E:\Work\podofo_bin\src\libpng16.lib(pngwutil.obj) podofo_shared Error 24 error LNK2001: unresolved external symbol
_deflateEnd E:\Work\podofo_bin\src\PdfFiltersPrivate.obj podofo_shared Error 25 error LNK2001: unresolved external symbol
_deflateEnd E:\Work\podofo_bin\src\libpng16.lib(pngwrite.obj) podofo_shared Error 26 error LNK2001: unresolved external symbol
_inflateInit_ E:\Work\podofo_bin\src\PdfFiltersPrivate.obj podofo_shared Error 27 error LNK2001: unresolved external symbol
_inflateInit_ E:\Work\podofo_bin\src\libpng16.lib(pngrutil.obj) podofo_shared Error 28 error LNK2001: unresolved external symbol
_inflate E:\Work\podofo_bin\src\PdfFiltersPrivate.obj podofo_shared Error 29 error LNK2001: unresolved external symbol
_inflate E:\Work\podofo_bin\src\libpng16.lib(pngrutil.obj) podofo_shared
Остальное в ответ.