У меня есть проект Visual Studio 12; исходный код написан на C ++; это проект OpenCV. Я хочу передать свою скомпилированную программу кому-то другому, но на другом ПК я получаю сообщение об ошибке об отсутствии некоторых DLL. Моя программа использует множество OpenCV (может быть, не только) dll. Как я могу решить эту проблему? Может быть, в VS 12 доступна опция включения всех dll в .exe? Это очень похожий вопрос без правильного ответа: включить библиотеки DLL в Visual Studio c ++ 2008
Как включить все dll в exe?
Ответы (4)
Сами библиотеки DLL не могут быть статически связаны с исполняемым файлом; это полностью противоречит их предназначению (ну, на самом деле вы можете использовать некоторые действительно странные уловки вуду, чтобы действительно сделать это, но это не рекомендуется, и вам не следует пробовать его, если вам нужно задать этот вопрос).
Простым решением было бы идентифицировать все библиотеки DLL, которые требуются вашей программе (при простом запуске программы в отладчике будет создан файл журнала, в котором перечислены все эти библиотеки) и скопировать эти библиотеки DLL в тот же каталог, где находится EXE; как это бывает, каталог с EXE-файлом также является первым каталогом, в котором система ищет библиотеки DLL перед переходом к стандартным системным каталогам в конфигурации по умолчанию. Упакуйте его и распределите таким образом.
.java
и дополнительные ресурсы. Конечно, в этой ситуации JRE может выполнять всю обработку исполняемых файлов для поддержки этого: загружать DLL из контейнера в адресное пространство процесса и выполнять все перемещения и динамическое связывание. Выполнение JIT-компиляции и загрузка кода в пространство процесса - это описание работы интерпретатора среды выполнения, такого как JRE.
- person datenwolf; 28.02.2019
более сложным решением было бы создать статические библиотеки opencv из src, а затем связать вашу программу с ними, в результате чего получится 1 большой двоичный исполняемый фрагмент, который не использует никаких dll (кроме ffmpeg, не уверен в этом).
для создания статических библиотек вам нужно запустить cmake с: BUILD_SHARED_LIBS = OFF
но перед этим сделайте глубокий вдох. связывание вашей программы будет значительно сложнее, потому что теперь вам нужно вручную связать все zlib, libpng и любые зависимости (которые раньше были удобно связаны с вашими dll)
Опять же, самое простое решение - развернуть все DLL opencv вместе с вашей программой.
Вы можете использовать Windows Dependency Walker, чтобы определить, какие библиотеки DLL необходимо запускать вашей программе.
Фактически, это только говорит вам, какие библиотеки DLL нужны вашей программе для успешного запуска. Если вы загружаете библиотеки DLL динамически (через LoadLibrary), вы сами по себе.
Если вы выберете общепринятое решение (упакуйте библиотеки DLL в EXE-файл) и не хотите беспокоиться о том, какие библиотеки DLL использовать, то вы можете скопировать все библиотеки DLL OpenCV. Они не такие большие (65 МБ на OpenCV 2.43). Они расположены по адресу ...\opencvXXX\build\x64\vc10\bin\
где XXX
- версия OpenCV. Вы можете использовать x64
или x86
в зависимости от вашей платформы (32 или 64-разрядной). И версия vc
в вашей системе может быть другой (vc9
, vc10
и т. Д.)