2

编辑:是的,我看过这篇文章。不幸的是,看起来用户最终还是使用了 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位有一个选项。我选择这个选项)。我希望它们是静态库,所以我启用了 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++ > 预处理器 > 预处理器定义
  • 我将每个该死的头目录添加到属性页 > 配置属性 > 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)

其他人可以试试我在这里做什么并指出我的错误吗?我试图提供足够的信息让大家看看发生了什么。

谢谢阅读!

4

2 回答 2

4

我已经能够使用 Visual Studio 2010 构建 TagLib 1.7。

我的脚步

使用 CMake gui 会引发 ZLIB 错误并手动添加 zlib 目录和 lib 将生成 Visual Studio 解决方案,但不会生成 .dll 文件(链接错误)

于 2011-03-20T00:39:46.843 回答
0

问题是__clrcall。您没有提到您的项目是 C++/CLI,但这是一个非常重要的细节。

人们已经在其他库中遇到过这种情况,例如 Oracle DB

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

让 Visual C++ 知道 taglib 是本机代码。

于 2011-03-20T00:46:22.450 回答