Моя организация публикует довольно обширную библиотеку на основе C++17 и связанные с ней приложения, а также мы публикуем привязки Java и C# с помощью Swig. Наша библиотека и привязки поддерживают множество разновидностей и версий macOS, Linux и Windows. Мы успешно делали это в течение многих лет без проблем, но столкнулись с небольшой проблемой, связанной с файлом vcruntime140.dll, который поставляется с JVM.
My tl; Согласно рекомендациям Microsoft, вам не следует поставлять среду выполнения VC, а следует отправить или предоставить ссылку на установщик среды выполнения VC, позволяющий пользователю установить (или уже иметь) времени выполнения в своей системе и получать соответствующие обновления безопасности и исправления ошибок для нее от Microsoft. Похоже, что JVM нарушает эти рекомендации, отправляя файл vcruntime140.dll напрямую (а не только Oracle JVM... похоже, что OpenJDK, Temurin и другие сделали/сделали это). И до сих пор это ничего для нас не сломало.
Но теперь выяснилось, что Microsoft ввела одну или несколько двоичных несовместимостей со средой выполнения VC между версиями 14.31 (поставляемыми с JVM). и 14.40 (среда выполнения, установленная на наших сборщиках от Microsoft, с которой связываются все наши библиотеки, привязки и приложения во время сборки). Когда opt-версия нашей библиотеки привязок загружается с помощью Java System.loadLibrary(libName), мы получаем ошибки совместимости, которые препятствуют загрузке. У нас нет такой же ошибки при загрузке отладочной версии наших привязок, что имеет смысл, поскольку JVM не поставляется с отладочной версией среды выполнения VC. Мы также не получим ошибок, если (временно) заменим vcruntime140.dll в каталоге bin JVM копией текущего файла из системных каталогов, но мы не можем попросить наших пользователей сделать это. , и неизвестно, какие потенциальные ошибки могут возникнуть в самой JVM.
Мы попытались явно загрузить системную библиотеку времени выполнения VC версии 14.40 с помощью System.load(vcRuntimeDLLfile) перед загрузкой нашей библиотеки, и хотя это удается (исключений не возникает), оно игнорируется (или, скорее, предпочтительнее более старая версия, загруженная первой), поскольку мы все еще не можем загрузить opt-версию наших привязок. Похоже, что нет способа сообщить базовой системе, что нам нужна более новая версия для нашей библиотеки привязок.
В этой документации Oracle предполагается, что они рекомендуют выпустить vcruntime140. dll, которая нужна вашей библиотеке вместе с вашей библиотекой, что нарушает вышеупомянутые рекомендации Microsoft, и другие члены моей команды не решаются сделать это по ряду причин. Однако я начинаю думать, что другого выхода у нас нет. Я предполагаю, что нам нужно будет предоставить его под другим именем (например, vcruntime14.40.dll) в нашем файле Jar и связать его с этим другим именем, чтобы гарантировать, что DLL, предоставленная JVM, не будет выбрана вместо нашей. . Ужасно!
Одна мысль, которую я изучаю, - это всегда связывать наши привязки Windows opt с отладочной версией среды выполнения VC, чтобы обходить DLL, предоставляемую JVM. Я пока не уверен, сработает ли это вообще или будет слишком много недостатков/влияния на производительность.
Мы что-то упускаем из виду? Есть ли другой вариант решения этой проблемы? Права ли Microsoft, а разработчики JVM ошибаются? Правы ли разработчики JVM, а Microsoft ошибается? По крайней мере, я понимаю, почему разработчики JVM захотели включить эту DLL, учитывая, что Microsoft нарушает двоичную совместимость — одно обновление Windows может сделать установку Java совершенно бесполезной, если она зависит от среды выполнения системы!
Подробнее здесь: https://stackoverflow.com/questions/789 ... ed-with-th
Как разрешить этот конфликт связи с vcruntime140.dll, поставляемым с JVM? ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как разрешить этот конфликт связи с vcruntime140.dll, поставляемым с JVM?
Anonymous » » в форуме JAVA - 0 Ответы
- 44 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как разрешить этот конфликт связи с vcruntime140.dll, поставляемым с JVM?
Anonymous » » в форуме JAVA - 0 Ответы
- 32 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как разрешить этот конфликт связи с vcruntime140.dll, поставляемым с JVM?
Anonymous » » в форуме C++ - 0 Ответы
- 27 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Проблема с разъемом MySQL C ++ (v9.2): нарушение доступа в vcruntime140.dll [закрыто]
Anonymous » » в форуме C++ - 0 Ответы
- 35 Просмотры
-
Последнее сообщение Anonymous
-