【问题标题】:Using TagLib in Visual Studio 2010在 Visual Studio 2010 中使用 TagLib
【发布时间】:2010-12-10 22:40:17
【问题描述】:

编辑:是的,我看过this post。不幸的是,看起来用户最终还是使用了 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));

mpegheader.cpp 第 171 行:

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

然后我将 mpegfile.cpp 中的第 436 行和第 437 行注释掉,因为 I think it's a bug.

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

然后我在发布模式下构建项目。它构建得很好。没有错误(虽然有一堆警告)。

所以我生成了 tag.lib。然后我创建了一个测试 VS2010 项目/解决方案来使用 TagLib。

这是我使用 TagLib 的唯一行。请注意,只是一个测试。

TagLib::MPEG::File a("tests/other/blank.mp3");
  • 我将TAGLIB_STATIC 添加到所有配置(发布和调试版本)的预处理器选项(Property Pages > Configuration Properties > C/C++ > Preprocessor > Preprocessor Definitions
  • 我将每个该死的头目录添加到 Property Pages > Configuration Properties > C/C++ > General > Additional Include Directories
  • 最后,我按此顺序将 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)

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

感谢阅读!

【问题讨论】:

    标签: visual-studio-2010 visual-c++ c++-cli static-libraries taglib


    【解决方案1】:

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

    我的步骤

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

    【讨论】:

      【解决方案2】:

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

      人们有run into this with other libraries, like Oracle DB

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

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

      【讨论】:

        猜你喜欢
        • 2011-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多