0

私は C++ の「分野」にまったく慣れていないので、これが単なる愚かな「C++ 文字列」の質問にならないことを願っています。

これが私の問題です。TagLib (Windows 用にビルドできたらすぐに 1.5、1.6) を既存の Windows MFC VS2005 プロジェクトに統合したいと考えています。オーディオファイルのメタデータを読み取るために必要です(書き込みではありません)。

問題は、プログラムが CString() を使用して入力ファイル名を保存し、Unicode オプションがオンになっていることです (したがって、デフォルトの文字は "wchar_t" です)。この理由 (プロジェクトは他の誰かによって開始されたと思います) は、「入力」ファイル名の一部に Unicode 文字 (たとえば、日本語やアラビア文字) が含まれている可能性があるためです。

たとえば、ファイル パスは「d:\docs\audio_test\stragecharڝhere.mp3」のようなものですが、次のように取得します。

CString fpath = tmpFile->GetFilePath();

今..私がやろうとすると:

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

私は次のようなものを得ます:

未解決の外部シンボル "__declspec(dllimport) public: __thiscall TagLib::FileName::FileName(wchar_t const *)"

次のようなことを試してみると:

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

コンパイル エラーは解消されましたが、「f」は無効なポインター/オブジェクトです。タグを読み取ろうとすると、失敗したアサートが表示されます。

それで、その CString を Unicode 形式でTagLibに渡す方法について、誰かが私にいくつかの指針を与えることができますか?

更新: TagLib アドレス: http://developer.kde.org/~wheeler/taglib.html

ありがとうございました、

アレックス

4

2 に答える 2

3

ここで説明されている問題が原因で問題が発生している可能性があります。基本的に、MSVC にはwchar_t型を異なる方法で処理するオプションがあります。これにより、コンパイルされたライブラリは、そのオプションなしでコンパイルされたアプリケーションとバイナリ互換性がなくなります。残念ながら、CMakeLists.txtビルド ファイルは/Zc:wchar_t-デフォルトでこのオプションを有効にします。ファイルを編集してオプションを削除し、TagLib を再コンパイルしてみます。多くのバグ修正が含まれているため、理想的にはバージョン 1.6 です。

于 2009-10-06T16:16:12.260 に答える
1

あなたの投稿を最初に読んだとき、私は何か重要なことを見逃していたので、ここに別の新しく改善された答えがあります:

エラーは、コンパイラではなくリンカから発生します。したがって、TagLib::FileName にctor を取るように見えwchar_t const*ますが、問題は、それを実装するライブラリとリンクしていないか、それを含まないバージョンのライブラリとリンクしていないことです。

IIUC、このライブラリは Linux の世界 (ファイル名がchar配列で表現される) から来ており、後に Windows (ファイル名がwchar_t配列で表現される) に移植されました。したがって、配列を受け取る FileName ctorwchar_tはおそらく Windows で条件付きでコンパイルされ (つまり、内部#ifdef _WIN32または同様のもの)、リンクしているライブラリ (ライブラリをリンクしている場合) は、同じプリプロセッサ定義でコンパイルされていません。

于 2009-10-06T15:02:42.067 に答える