我对C ++'领域'很陌生,所以我希望这不仅仅是另一个愚蠢的'C ++字符串'问题。
这是我的问题。我希望将TagLib(1.5,1.6,一旦我设法为Windows构建它)集成到现有的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”是一个无效的指针/对象..当我尝试读取标记时,我收到一个断言失败。
那么,任何人都可以给我一些指示,我应该如何将它的Unicode格式的CString传递给TagLib?
更新:TagLib address: http://developer.kde.org/~wheeler/taglib.html
谢谢,
亚历
答案 0 :(得分:3)
问题可能是由here描述的问题引起的。基本上,MSVC可以选择不同地处理wchar_t
类型,这会导致编译库与没有该选项编译的应用程序不是二进制兼容的。遗憾的是,CMakeLists.txt
构建文件默认启用/Zc:wchar_t-
选项。我尝试编辑该文件,删除该选项并重新编译TagLib。理想情况下版本1.6,因为它包含许多错误修复。
答案 1 :(得分:1)
当我第一次阅读你的帖子时,我错过了一些必要的东西,所以这是另一个新的和改进的答案:
错误来自链接器,而不是编译器。因此,似乎TagLib :: FileName 有一个ctor采用wchar_t const*
,但问题是你没有链接到实现它的库,或链接到库的版本不包括它。
IIUC,这个库来自Linux世界(文件名表示为char
数组),后来移植到Windows(文件名表示为wchar_t
数组)。因此,采用wchar_t
数组的FileName ctor可能是在Windows上有条件地编译的(即,在#ifdef _WIN32
内部或类似的东西),并且您链接的库(如果您正在链接库)未编译使用相同的预处理器定义。