2014-06-17 7 views
7

Ich habe ein Projekt, das zu einem halben Dutzend Bibliotheken, darunter OpenCV verbindet.
Da Release-Version abstürzt, während Debug funktioniert gut (nur viel langsamer), wollte ich mein Projekt in RelWithDebInfo Konfiguration zu kompilieren.
Allerdings wird Debug Version der OpenCV-Bibliotheken statt Release (OpenCV hat keine RelWithDebInfo Variante) enthalten. Dies verursacht Fehler Verknüpfung wie:CMake RelWithDebInfo Links zu Debug-Bibliotheken

opencv_core249d.lib (alloc.obj): Fehler LNK2038: Nichtübereinstimmung erkannt für 'Runtimelibrary': value 'MDd_DynamicDebug' Wert nicht übereinstimmt 'MD_DynamicRelease' in MyProject.obj

Wie löst man dieses Problem?

+0

Ich löse dies, indem ich nie das INSTALL-Ziel in Windows verwende. Richten Sie stattdessen die PROJECTNAME_DIR-Variablen auf den Stammordner, in dem Sie die Bibliothek erstellt haben. Ich baue auch alle Abhängigkeiten mit dem Compiler, den ich verwende, und verwende niemals Binärpakete. Wenn Sie opencv von der Quelle erstellen, wird die RelWithDebInfo-Konfiguration trotzdem entfernt? – drescherjm

+0

Ich habe OpenCV aus der Quelle gebaut. Ich hatte dieses Problem mit vorkompiliertem OpenCV nicht. –

Antwort

14

Lösung: in dem CMakeLists.txt, nach dem Aufruf von FIND_PACKAGE(OpenCV):

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

Das hat mir viel Arbeit und Arbeit erspart. Danke :) – Baiz

+0

Dies funktioniert die meiste Zeit für mich, aber einige der Ziele kommen immer noch als Debug-Bibliotheken durch. Ich habe jedes einzelne mögliche opencv Ziel aufgelistet, um sicherzustellen, dass es auch abhängige Ziele erhält. –

1

mir die oben genannten Antwort von Dženan verwendet habe, fand aber, dass einige opencv Bibliotheken dies ignorieren und verknüpfen noch debug! Dies führt zu einem msvc-Projekt, das Mixed-Release- und Debug-Bibliotheken für opencv verbindet. Meine Lösung bestand darin, ein neues OpenCVModules-relwithdebinfo.cmake in Ihrem libdir-Verzeichnis der opencv-Installation zu erstellen, das eine Kopie der OpenCVModules-release.cmake-Datei ist. Dann ersetzen alle Referenzen auf RELEASE mit RELWITHDEBINFO. Dies erzeugt ein msvc-Projekt, das vollständig mit opencv-Release-Bibliotheken verknüpft ist. Der zusätzliche Vorteil besteht darin, dass Sie die CMake-Dateien Ihres Projekts nicht ändern müssen, um dies zu berücksichtigen.

+0

Haben Sie einen Fehlerbericht für CMake eingereicht? Es ist besser, ein Problem zu lösen, als es zu umgehen, was Sie vorschlagen. –

+0

Ich kann nicht sicher sein, ob dies ein CMake-Problem oder ein Problem mit OpenCVs CMake-Skripten ist. Ich untersuche immer noch weiter, wenn ich Zeit habe. –