2014-06-17 9 views
7

Ho un progetto che collega a una mezza dozzina di librerie, tra cui OpenCV.
Poiché la variante di rilascio si interrompe, mentre Debug funziona correttamente (solo molto più lentamente), volevo compilare il mio progetto nella configurazione RelWithDebInfo.
Tuttavia, la versione Debug delle librerie OpenCV viene inclusa invece di Release (OpenCV non ha la variante RelWithDebInfo). Questo fa sì che collega errori come:CMake RelWithDebInfo collegamenti a Debug libs

opencv_core249d.lib (alloc.obj) errore LNK2038: mancata corrispondenza rilevata per 'RuntimeLibrary': valore 'MDd_DynamicDebug' non corrisponde valore 'MD_DynamicRelease' in MyProject.obj

Come risolvere questo problema?

+0

Risolvo questo problema non utilizzando mai la destinazione INSTALL in Windows. Puntare invece le variabili PROJECTNAME_DIR nella cartella radice in cui è stata creata la libreria. Inoltre, creo tutte le dipendenze con il compilatore che sto usando e non uso mai pacchetti binari. Se si crea opencv dal sorgente, si elimina ancora la configurazione RelWithDebInfo? – drescherjm

+0

Ho costruito OpenCV dal sorgente. Non ho avuto questo problema con OpenCV precompilato. –

risposta

14

Soluzione: aggiungere al CMakeLists.txt, dopo la chiamata a FIND_PACKAGE(OpenCV):

set_target_properties(${OpenCV_LIBS} PROPERTIES MAP_IMPORTED_CONFIG_RELWITHDEBINFO RELEASE) 
+1

Questo mi ha risparmiato un sacco di ricerche e lavoro. Grazie :) – Baiz

+0

Questo funziona la maggior parte del tempo per me, ma alcuni degli obiettivi vengono ancora come librerie di debug. Ho elencato ogni singolo obiettivo di visibilità possibile per assicurarmi che ottenga anche obiettivi dipendenti. –

1

Ho usato la risposta di cui sopra da Dzenan ma ho trovato che alcune librerie OpenCV ignorano questo e ancora collegano il debug! Ciò si traduce in un progetto msvc che collega le librerie miste di debug e di rilascio per opencv. La mia soluzione era creare un nuovo OpenCVModules-relwithdebinfo.cmake nella cartella lib della tua installazione opencv, che è una copia del file OpenCVModules-release.cmake. Quindi sostituire tutti i riferimenti in RELEASE con RELWITHDEBINFO. Questo produce un progetto msvc che si collega interamente alle librerie di rilascio di opencv. Il vantaggio ulteriore è che non è necessario modificare i file CMake del progetto per tener conto di ciò.

+0

Hai inviato una segnalazione di bug per CMake? È meglio risolvere un problema piuttosto che aggirare il problema, che è quello che suggerisci. –

+0

Non posso essere sicuro che questo sia un problema di CMake o un problema con gli script di CMake di OpenCV. Sto ancora indagando ulteriormente quando avrò tempo. –