Pergunta

Eu sou muito novo na 'área' C ++, então espero que isso não seja apenas mais uma pergunta boba 'C ++'.

Aqui está o meu problema. Eu quero integrar Taglib (1.5, 1.6 assim que eu conseguir construí -lo para o Windows) em um projeto Windows MFC vs2005 existente. Preciso ler os metadados de arquivos de áudio (não gravar).

O problema é que o programa armazena os nomes de arquivos de entrada usando CString () e possui a opção Unicode ligada (para que os chars padrão sejam "wchar_t"). A razão para isso (eu acho, o projeto foi iniciado por outra pessoa) é que alguns dos nomes de arquivos de 'entrada' poderiam conter Charaters Unicode (por exemplo, Japão ou caracteres árabes).

Por exemplo, o caminho do arquivo é algo como "d: docs audio_test stragechar ڝ aqui.mp3", mas eu o entendo:

CString fpath = tmpFile->GetFilePath();

Agora .. se eu tentar fazer:

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

Eu recebo algo como:

Símbolo externo não resolvido "__declspec (dllimport) public: __thiscall taglib :: filename :: filename (wchar_t const *)"

Se eu tentar algo como:

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

Eu me livro dos erros de compilação, mas "F" é um ponteiro/objeto inválido. E quando tento ler uma tag, recebo uma afirmação falhada.

Então, alguém pode me dar algumas dicas sobre como devo passar por esse cString, em sua forma unicode, para o Taglib ?

Atualizar: Endereço Taglib: http://developer.kde.org/~wheeler/taglib.html

Obrigada,

Alex

Foi útil?

Solução

Perdi algo essencial quando li sua postagem, então aqui está outra resposta nova e aprimorada:

O erro vem do vinculador, não do compilador. Parece assim que Taglib :: FileName faz ter um CTOR tomando wchar_t const*, mas o problema é que você não se vincula à biblioteca implementando -o ou vincular uma versão da biblioteca que não a inclui.

IIUC, esta biblioteca vem do mundo Linux (onde os nomes de arquivos são expressos como char matrizes) e foi posteriormente portado para o Windows (onde os nomes de arquivos são expressos como wchar_t matrizes). O nome do arquivo ctor tomando um wchar_t A matriz é, portanto, provavelmente compilada condicionalmente no Windows (ou seja, dentro #ifdef _WIN32 ou algo semelhante), e a biblioteca com a qual você está vinculando (se você está vinculando a biblioteca) não foi compilado com o mesmo pré -processador.

Outras dicas

É possível que o problema seja causado pelo problema descrito aqui. Basicamente, o MSVC tem uma opção para tratar o wchar_t Digite de maneira diferente, o que causa a biblioteca compilada não é compatível com um aplicativo compilado sem essa opção. Infelizmente, o CMakeLists.txt o arquivo de construção permite o /Zc:wchar_t- opção por padrão. Eu tentaria editar o arquivo, remover a opção e recorrer Taglib. Idealmente, a versão 1.6, pois contém muitas correções de bugs.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top