簡體   English   中英

在 Visual Studio 2010 中使用 TagLib

[英]Using TagLib in Visual Studio 2010

編輯:是的,我看過這篇文章 不幸的是,看起來用戶最終還是使用了 MingW。


我在Windows 7 ,64位。 我從 SVN 存儲庫下載了最新版本的 TagLib 代碼。 我正在使用修訂版1202935

我正在嘗試在Visual Studio 2010中使用 TagLib。 我已經讓 TagLib 與 QtCreator/MingW 一起工作,但我想開始學習 Windows API 所以我在 Visual Studio 2010 中從頭開始(當然是 C++)。

在 VS2010 中,我構建了 zlib(靜態和動態)和帶有和不帶 zlib(靜態和動態)的 TagLib。 換句話說,我已經嘗試了我能想到的一切來讓它發揮作用。

我的理想情況是我使用CMake為TagLib生成VS2010工程文件(VS2010 64位有一個選項,我選這個選項)。 我希望它們是 static 庫,所以我啟用 ENABLE_STATIC,並啟用 WITH_ASF 和 WITH_MP4。 我還使用 ZLIB_INCLUDE_DIR 和 ZLIB_LIBRARY 將 TagLib 指向 zlib(我正在鏈接到我之前使用 VS2010 構建的 zlib.lib 文件)。 注意,我使用的是 CMake GUI。

然后,我在 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));

第 171 行的mpegheader.cpp

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

然后我在mpegfile.cpp中注釋掉第 436 和 437 行,因為我認為這是一個錯誤

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

然后我在發布模式下構建項目。 它構建得很好。 沒有錯誤(盡管有一堆警告)。

所以我生成了 tag.lib 然后我創建了一個測試 VS2010 項目/解決方案來使用 TagLib。

這是我使用 TagLib 的唯一行。 只是一個測試,請注意。

TagLib::MPEG::File a("tests/other/blank.mp3");
  • 我將TAGLIB_STATIC添加到所有配置(發布和調試版本)的預處理器選項(屬性頁 > 配置屬性 > C/C++ > 預處理器 > 預處理器定義
  • 我將每個該死的 header 目錄添加到屬性頁 > 配置屬性 > C/C++ > 常規 > 附加包含目錄
  • 最后,我將 zlib.lib 和 tag.lib 添加到附加依賴項(屬性頁>配置屬性> Linker>輸入>附加依賴項)中

“呼?好麻煩!現在讓我們看看它是否有效?”

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)

其他人可以試試我在這里做什么並指出我的錯誤嗎? 我試圖提供足夠的信息讓大家看看發生了什么。

謝謝閱讀!

我已經能夠使用Visual Studio 2010構建TagLib 1.7。

我的腳步

使用CMake gui會引發ZLIB錯誤,並手動添加zlib目錄和lib將生成Visual Studio解決方案,但不會生成.dll文件(鏈接錯誤)

問題是__clrcall 您沒有提到您的項目是C ++ / CLI,但這是一個非常重要的細節。

人們已經與其他庫(例如Oracle DB)碰到了這一點

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

讓Visual C ++知道taglib是本機代碼。

在您的代碼中定義宏“TAGLIB_STATIC”!

例子

#define TAGLIB_STATIC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM