2016-05-31 7 views
1

Ich habe versucht, eine Bibliothek (nennen wir es LibB) zu einem Programm (TheProgram), die bereits eine andere Bibliothek verknüpft (LibA) zu verknüpfen.RuntimeLibrary stimmt nicht überein, obwohl die richtigen Flags an alle Objekte übergeben werden?

Die Debug-Konfiguration baut in Ordnung, aber im Release-Modus bekomme ich diesen Fehler:

error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MTd_StaticDebug' in TheProgram.obj

Ich dachte, das ist einfach zu beheben, weil ich nur sicher vornehmen müssen, dass jede der verknüpften Objekte gebaut werden mit/MT. Ich tat es, und sie alle sind es. Ich habe auch überprüft, ob es irgendwelche Einstellungen pro Datei gibt, die das Laufzeit-Flag in dieser Konfiguration anders haben - es gibt keine. Auch die letzte Befehlszeile im Build überprüft - es ist/MT überall.

Noch interessanter, wenn ich die Debug-Version von LibB verknüpfen (beim Erstellen der Release-Konfiguration), verschwindet dieser Fehler, aber ich bekomme andere Fehler.

Was könnte die Übereinstimmung trotz der übereinstimmenden Flags überall verursachen?

Antwort

1

Das machte mich verrückt und brauchte Tage, um zu entdecken. Ich wollte das hier teilen, denn es gibt eine Fülle von Fragen, bei denen das Problem eigentlich nicht passt/M * -Flags, aber das war hier nicht der Fall.

Der Fehler war, dass ich einen neuen Präprozessor definieren im Debug-Modus, dann über das gesamte Feld in die Release-Konfiguration kopiert (nicht mit der Maus Auswahl geifern wollen). Dieses Feld enthielt _DEBUG (anstelle von NDEBUG) und verursachte, dass der Linker erkannte, dass/MTd verknüpft war. Als ich _DEBUG zu NDEBUG in den Preprocessor-Definitionen im Freigabemodus änderte, wurde das Problem gelöst.

Als Randbemerkung, habe ich versucht, den Fehler in git diff, zu finden, weil ich eine ziemlich gute Idee hatte, die es eingeführt commit, aber es war sehr schwer, ohne ein Wort-für-Wort diff zu sehen aufgrund der Art von das VS-Projektdateiformat. Ein Kollege entdeckte diese Definition für mich, aber er wies mich auch auf diese Antwort über highlighting word differences in git diff hin, ich denke, das kann sehr nützlich sein, um solche Probleme zu finden.