Frage

Ich bin ziemlich neu im Bereich C ++ 'Bereich', also hoffe ich, dass dies nicht nur eine weitere alberne Frage der C ++ - Strings 'sein wird.

Hier ist mein Problem. Ich möchte integrieren Taglib (1.5, 1.6, sobald ich es schafft, es für Windows zu erstellen) in ein vorhandenes Windows MFC VS2005 -Projekt. Ich brauche es, um Audio -Dateien -Metadaten zu lesen (nicht schreiben).

Das Problem ist, dass das Programm die Eingabedateinamen mit Cstring () speichert und die Option Unicode eingeschaltet ist (so sind die Standard -Zeichen "wchar_t"). Der Grund dafür (ich glaube, das Projekt wurde von jemand anderem gestartet) ist, dass einige der "Eingabedateinamen" Unicode -Charater (z. B. Japanse oder arabische Zeichen) enthalten könnten.

Der Dateipfad ist beispielsweise so etwas wie "D: docs audio_test stragechar ڝ hier.mp3", aber ich bekomme es mit:

CString fpath = tmpFile->GetFilePath();

Jetzt .. wenn ich versuche zu tun:

TagLib::FileRef f(fpath.GetBuffer(0));
fpath.ReleaseBuffer();

Ich bekomme so etwas wie:

ungelöstes externes Symbol "__declspec (dllimport) public: __thiscall Taglib :: Dateiname :: Dateiname (wchar_t const *)"

Wenn ich so etwas versuche wie:

TagLib::FileRef f(reinterpret_cast<char*>(fpath.GetBuffer(0)));
fpath.ReleaseBuffer();

Ich werde die Kompilierungsfehler los, aber "f" ist ein ungültiger Zeiger/Objekt. Und wenn ich versuche, ein Tag zu lesen, erhalte ich eine Behauptung fehl.

Kann mir also jemand einige Hinweise darauf geben, wie ich diesen Cstring in seiner Unicode -Form an die Taglib ?

Aktualisieren: Taglib Adresse: http://developer.kde.org/~wheeler/taglib.html

Vielen Dank,

Alex

War es hilfreich?

Lösung

Ich habe etwas Wesentliches verpasst, als ich Ihren Beitrag zum ersten Mal gelesen habe. Hier ist eine weitere, neue und verbesserte Antwort:

Der Fehler kommt vom Linker, nicht vom Compiler. Es scheint also, dass Taglib :: Dateiname tut eine CTOR nehmen wchar_t const*, Aber das Problem ist, dass Sie nicht mit der Bibliothek verknüpfen oder mit einer Version der Bibliothek verknüpfen, die sie nicht enthält.

IIUC stammt diese Bibliothek aus der Linux -Welt (wo Dateinamen als Dateinamen ausgedrückt werden char Arrays) und später auf Windows portiert (wo Dateinamen als Dateinamen ausgedrückt werden als wchar_t Arrays). Der Dateiname CTOR nimmt a wchar_t Array ist daher wahrscheinlich bedingt auf Fenstern kompiliert (dh im Inneren #ifdef _WIN32 oder ähnliches), und die Bibliothek, mit der Sie verknüpfen (wenn Sie die Bibliothek verknüpfen), wurde nicht mit denselben Vorprozessor -Definierungen zusammengestellt.

Andere Tipps

Es ist möglich, dass das Problem durch das beschriebene Problem verursacht wird hier. Grundsätzlich hat MSVC die Möglichkeit, die zu behandeln wchar_t Typ anders, wodurch die kompilierte Bibliothek nicht binär kompatibel mit einer Anwendung ist, die ohne diese Option zusammengestellt wird. Leider das CMakeLists.txt Erstellendatei aktivieren die /Zc:wchar_t- Option standardmäßig. Ich würde versuchen, die Datei zu bearbeiten, die Option zu entfernen und Taglib neu zu kompilieren. Idealerweise enthält Version 1.6, da es viele Fehlerbehebungen enthält.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top