Использование TagLib в Visual Studio 2010 - PullRequest
2 голосов
/ 11 декабря 2010

РЕДАКТИРОВАТЬ: Да, я посмотрел на этот пост . К сожалению, похоже, что пользователь в конечном итоге использует MingW.


Я на Windows 7 , 64-разрядная. Я загрузил самую последнюю версию кода TagLib из репозитория SVN. Я использую ревизию 1202935 .

Я пытаюсь использовать TagLib в Visual Studio 2010 . Я получил TagLib для работы с QtCreator / MingW, но я хочу начать изучать Windows API, поэтому я начинаю с нуля в Visual Studio 2010 (конечно, C ++).

В VS2010 я собрал zlib (статически и динамически) и TagLib с zlib и без (статически и динамически). Другими словами, я перепробовал все, что мог придумать, чтобы заставить это работать.

Моя идеальная ситуация заключается в том, что я использую CMake для генерации файлов проекта VS2010 (есть опция для 64-битной VS2010. Я не выбираю эту опцию) для TagLib. Я хотел бы, чтобы они были статическими библиотеками, поэтому я включаю ENABLE_STATIC, а также WITH_ASF и WITH_MP4. Я также направляю TagLib в zlib, используя ZLIB_INCLUDE_DIR и ZLIB_LIBRARY (я ссылаюсь на файл zlib.lib, который я ранее построил с использованием VS2010). Обратите внимание, я использую графический интерфейс CMake.

Затем я открываю сгенерированные файлы проекта в VS2010 и делаю три изменения в коде, чтобы он безошибочно собирался в Visual Studio 2010 ( Я помещаю исправления здесь для всех, у кого была такая же проблема, как и у меня ).

apefooter.cpp в строке 192:

std::bitset<32> flags(static_cast<unsigned long long>(data.mid(20, 4).toUInt(false)));

mpcproperties.cpp в строке 116:

std::bitset<32> flags = static_cast<unsigned long long>(d->data.mid(8, 4).toUInt(false));

mpegheader.cpp в строке 171:

std::bitset<32> flags(static_cast<unsigned long long>(data.toUInt()));

Затем я закомментирую строки 436 и 437 в mpegfile.cpp , потому что Я думаю, что это ошибка .

// ID3v2Tag(true);
// ID3v1Tag(true);

Затем я строю проект в режиме выпуска. Строит просто отлично. Нет ошибок (хотя есть куча предупреждений).

Итак, я сгенерировал tag.lib . Затем я создал тестовый проект / решение VS2010 для использования TagLib.

Это единственная строка, в которой я использую TagLib. Замечу, просто тест.

TagLib::MPEG::File a("tests/other/blank.mp3");
  • Я добавил TAGLIB_STATIC к параметрам препроцессора ( Страницы свойств> Свойства конфигурации> C / C ++> Препроцессор> Определения препроцессора ) для всех конфигураций (как выпускающих, так и отладочных сборок)
  • Я добавил каждый каталог заголовка штопки в Страницы свойств> Свойства конфигурации> C / C ++> Общие> Дополнительные каталоги включения
  • И, наконец, я добавил zlib.lib и tag.lib к дополнительным зависимостям ( Страницы свойств> Свойства конфигурации> Линкер> Вход> Дополнительные зависимости ) В ЭТОТ ЗАКАЗ

«Ух ты! Что за хлопоты! Теперь посмотрим, работает ли это?»

1>vs_taglib_test.obj : error LNK2028: unresolved token (0A00001A) "public: virtual __clrcall TagLib::MPEG::File::~File(void)" (??1File@MPEG@TagLib@@$$FUAM@XZ) referenced in function "int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z)
1>vs_taglib_test.obj : error LNK2028: unresolved token (0A00001B) "public: __clrcall TagLib::MPEG::File::File(class TagLib::FileName,bool,enum TagLib::AudioProperties::ReadStyle)" (??0File@MPEG@TagLib@@$$FQAM@VFileName@2@_NW4ReadStyle@AudioProperties@2@@Z) referenced in function "int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z)
1>vs_taglib_test.obj : error LNK2019: unresolved external symbol "public: virtual __clrcall TagLib::MPEG::File::~File(void)" (??1File@MPEG@TagLib@@$$FUAM@XZ) referenced in function "int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z)
1>vs_taglib_test.obj : error LNK2019: unresolved external symbol "public: __clrcall TagLib::MPEG::File::File(class TagLib::FileName,bool,enum TagLib::AudioProperties::ReadStyle)" (??0File@MPEG@TagLib@@$$FQAM@VFileName@2@_NW4ReadStyle@AudioProperties@2@@Z) referenced in function "int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z)

Может кто-нибудь еще попробовать, что я здесь делаю, и указать на мою ошибку? Я пытался предоставить достаточно информации, чтобы вы могли увидеть, что происходит.

Спасибо за чтение!

Ответы [ 2 ]

4 голосов
/ 20 марта 2011

Мне удалось собрать TagLib 1.7 с помощью Visual Studio 2010.

Мои шаги

  • Загрузить исходные коды zlib из http://zlib.net/

  • Загрузка бинов zlib из http://www.winimage.com/zLibDll/index.html

  • Настройка каталогов VC ++ для исходного кода и бинов zlib

  • Загрузка TagLib 1.7 из http://developer.kde.org/~wheeler/taglib.html

  • Извлечение каталога taglib-1.7

  • Используйте командную строку для запуска - cmake -G "Visual Studio 10" в каталоге taglib-1.7

  • Открыть и собрать taglib.sln

  • .dll и файлы lib перейдите в /taglib-1.7/taglib/Debug & /taglib-1.7/taglib/Release

Использование графического интерфейса CMake выдает ошибки для ZLIB, а добавление каталогов zlib и lib вручную создает решение для Visual Studio, но не генерирует файлы DLL (ошибки компоновки)

0 голосов
/ 20 марта 2011

Проблема __clrcall. Вы не упомянули, что ваш проект - C ++ / CLI, но это очень важная деталь.

Люди сталкиваются с другими библиотеками, такими как Oracle DB .

#pragma managed(push, off)
#include "taglib.h"
#pragma managed(pop)

, чтобы Visual C ++ знал, что taglib является нативным кодом.

...