Подтвердить что ты не робот

Использование статических библиотек вместо динамических библиотек в opencv

У меня есть проект в visual studio 2012, который использует динамические библиотеки opencv. Он скомпилирован, связан и хорошо работает.

Я хочу изменить проект, поэтому вместо динамических библиотек он использует статические библиотеки.

Я изменил каталоги библиотек в каталоге проекта VС++ из

  C:\thirdparty\opencv\build\x86\vc11\lib

чтобы:    C:\thirdparty\opencv\build\x86\vc11\staticlib

но когда я хочу построить проект, я получаю много ошибок компоновщика, например:

 Error  110 error LNK2001: unresolved external symbol _TIFFWriteScanline    myproject\opencv_highgui245.lib(grfmt_tiff.obj) 

и, что более важно, много ошибок, таких как:

 Error  1   error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease' in myproject.obj    myproject\opencv_core245.lib(system.obj)    

Какие еще изменения я должен сделать, чтобы преобразовать проект, который использует динамические библиотеки для использования статических библиотек?

Изменить 1

После изменения /md to/mt и добавления некоторых новых библиотек в список входных библиотек:

opencv_calib3d245.lib
opencv_contrib245.lib
opencv_core245.lib
opencv_features2d245.lib
opencv_flann245.lib
libtiff.lib
libpng.lib
libjpeg.lib
libjasper.lib
IlmImf.lib
zlib.lib
opencv_gpu245.lib
opencv_haartraining_engine.lib
opencv_highgui245.lib
opencv_imgproc245.lib
opencv_legacy245.lib
opencv_ml245.lib
opencv_nonfree245.lib
opencv_objdetect245.lib
opencv_photo245.lib
opencv_stitching245.lib
opencv_ts245.lib
opencv_video245.lib
opencv_videostab245.lib

Я получаю несколько новых ошибок:

Error   9   error LNK2001: unresolved external symbol [email protected]  myproject\opencv_highgui245.lib(cap_vfw.obj)    
Error   8   error LNK2001: unresolved external symbol [email protected]  myproject\opencv_highgui245.lib(cap_vfw.obj)    
Error   5   error LNK2001: unresolved external symbol [email protected]    myproject\opencv_highgui245.lib(cap_vfw.obj)    
Error   7   error LNK2001: unresolved external symbol [email protected]  myproject\opencv_highgui245.lib(cap_vfw.obj)    

По-видимому, какая-то библиотека отсутствует, но какая?

Изменить 2 необходимо добавить в список больше библиотеки. Полный список библиотеки следующий:

opencv_calib3d245.lib
opencv_contrib245.lib
opencv_core245.lib
opencv_features2d245.lib
opencv_flann245.lib
libtiff.lib
libpng.lib
libjpeg.lib
libjasper.lib
IlmImf.lib
zlib.lib
opencv_gpu245.lib
opencv_haartraining_engine.lib
opencv_highgui245.lib
opencv_imgproc245.lib
opencv_legacy245.lib
opencv_ml245.lib
opencv_nonfree245.lib
opencv_objdetect245.lib
opencv_photo245.lib
opencv_stitching245.lib
opencv_ts245.lib
opencv_video245.lib
opencv_videostab245.lib
Vfw32.Lib
comctl32.lib

Это решило проблему.

4b9b3361

Ответ 1

Я могу получить статические библиотеки, работающие в VS 2013, изменив проект Runtime Library на /MTd

enter image description here

а затем включив этот компоновщик → Ввод → Дополнительные зависимости:

opencv_core248d.lib
opencv_imgproc248d.lib
opencv_highgui248d.lib
opencv_ml248d.lib
opencv_video248d.lib
opencv_features2d248d.lib
opencv_calib3d248d.lib
opencv_objdetect248d.lib
opencv_contrib248d.lib
opencv_legacy248d.lib
opencv_flann248d.lib
libpngd.lib
libtiffd.lib
zlibd.lib
IlmImfd.lib
libjasperd.lib
libjpegd.lib
comctl32.lib
gdi32.lib
vfw32.lib

Ответ 2

Для Visual Studio 2012 с OpenCV 3.0.0 эти проблемы все еще применяются, и решения в этом потоке актуальны. Здесь моя настройка, чтобы заставить ее работать:

Переменные системной среды Windows

Установите в Windows "Переменные системной среды: OPENCV_DIR = D:\OpenCV\build\x64\v11 (замените D:\OpenCV\ на любой путь к opencv. Также x64 для 64-разрядных машин x86 для 32-разрядных машин).

Использовать staticlib for AdditionalLibraryDirectories

Задайте дополнительные каталоги библиотек ( "Просмотр" > "Страницы свойств" > "Свойства конфигурации" > "Коннектор" > "Основные" > "Дополнительные библиотечные каталоги" ): $(OPENCV_DIR)\staticlib;%(AdditionalLibraryDirectories)

Библиотека времени выполнения

Измените генерацию кодa > Библиотека времени выполнения на Multi-threaded Debug (/MTd) за ответ uosɐs, в противном случае вы получите такую ​​ошибку:

Error   1   error LNK2038: mismatch detected for 'RuntimeLibrary': value
'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in Source.obj
C:\Users\...\documents\visual studio 2012\Projects\OpenCVTest2\OpenCVTest2\opencv_core300d.lib(alloc.obj)   OpenCVTest2

Наконец, список дополнительных зависимостей

Мои дополнительные зависимости должны включать все имена библиотек в каталоге staticlib. Помните номера версий; поскольку я использую OpenCV 3.0.0, имена файлов заканчиваются на * 300d.lib. Я считаю, что comctl32.lib и vfw32.lib не находятся в staticlib, но я добавил их на всякий случай (View > Property Pages > Properties > Linker > Input > Additional Dependencies):

opencv_calib3d300d.lib
opencv_core300d.lib
opencv_features2d300d.lib
opencv_flann300d.lib
opencv_hal300d.lib
opencv_highgui300d.lib
opencv_imgcodecs300d.lib
opencv_imgproc300d.lib
opencv_ml300d.lib
opencv_objdetect300d.lib
opencv_photo300d.lib
opencv_shape300d.lib
opencv_stitching300d.lib
opencv_superres300d.lib
opencv_ts300d.lib
opencv_video300d.lib
opencv_videostab300d.lib
libtiffd.lib
libpngd.lib
libjpegd.lib
libjasperd.lib
IlmImfd.lib
libwebpd.lib
ippicvmt.lib
zlibd.lib
comctl32.lib
vfw32.lib

x86 vs x64

Я также столкнулся с этой проблемой, что VS2012 утверждает, что целевая машина не соответствует типу модуля модуля, например этого парня. Решение дано здесь.

Ответ 3

Если вы создаете CMake, то это очень просто, потому что это один из вариантов OpenCV CMake; просто установите значение BUILD_WITH_STATIC_CRT. Например. в командной строке CMake

-DBUILD_WITH_STATIC_CRT=OFF

Ответ 4

Чувак, позволь мне сказать тебе... был там. Я попробовал статическую библиотеку (пару раз..) Это зло.

  • Если вы используете Visual Studio, лучше отменить VS2010. VS2012 и выше не были использованы для создания этих библиотек. И это это правда, по крайней мере, для версии 244. Возможно, вы можете просто связать, но вы получите сбои с очень основными функциями. Так что пощадите себя.
  • Если вы используете GCC, вы можете просто обнаружить, что .a libs являются злыми   действительно.. Они были скомпилированы в windows для LINUX. Попытка   ссылка на cygwin, MinGw не будет выполнять эту работу.

Пробыв в течение 2 дней, я решил, что достаточно потратить время и отступить обратно в DLL, которые работают нормально, если вы используете VS2010.

Пусть это не будет поворотом. Если вам удалось связать, пожалуйста, поделитесь с нами всеми, как:)

Ответ 5

У меня есть приложение, которое зависит от OpenCV 2.4.9 со статической привязкой.

1) Я только что добавил дополнительные ссылки компоновщика:

opencv_core249d.lib opencv_imgproc249d.lib opencv_highgui249d.lib opencv_ml249d.lib opencv_video249d.lib opencv_features2d249d.lib opencv_calib3d249d.lib opencv_objdetect249d.lib opencv_contrib249d.lib opencv_legacy249d.lib opencv_flann249d.lib libpngd.lib libtiffd.lib zlibd.lib IlmImfd.lib libjasperd.lib libjpegd.lib comctl32.lib gdi32.lib vfw32.lib

2) Linker = > Общие = > Дополнительные каталоги библиотек = > изменено $(OPENCV_DIR)\x86\vc12\lib на $(OPENCV_DIR)\x86\vc12\staticlib, где OPENCV_DIR - это переменная окружения, установленная на: C:\OpenCV 2.4.9\opencv\build

3) и изменил C/С++ = > Генерация кода = > Многопоточная отладка DLL (MD) для многопоточной отладки (MTd)

и наслаждался успешной сборкой.

то же самое работает в режиме выпуска (конечно, ссылка на не-debug libs)