Qt 导入TagLib库

文章目录

  • [0. 前言和环境介绍](#0. 前言和环境介绍)
  • [1. 下载`TagLib`](#1. 下载TagLib)
  • [2. 下载`zlib`](#2. 下载zlib)
  • [3. 修改`.pro`文件](#3. 修改.pro文件)
  • [4. 测试代码](#4. 测试代码)

0. 前言和环境介绍

最近在使用Qt写一个播放器,需要解析mp3文件,于是研究了一下如何导入TagLib

Qt构建套件:Desktop Qt6.8.2 MinGW64-bit

Qt Creator安装目录: D:\bit\QT\QtCreator

电脑版本: Windows11

CMake版本:cmake version 3.31.3

1. 下载TagLib

首先去taglib/taglib: TagLib Audio Meta-Data Library下载TagLib的压缩包,写此文章时TagLib已经更新到了2.0.2版本

建一个build文件夹,进入该文件夹,输入如下的bash内容(不要输入注释),注意要给cmd管理员权限,而且各种mingw的各种编译器需要更改为你自己的Qt安装目录下的工具

cpp 复制代码
# 指定使用mingw的编译器(防止使用MSVC),BUILD_SHARED_LIBS=OFF,确保CMake不生成动态库相关的导出符号。
cmake -G "MinGW Makefiles" -DCMAKE_C_COMPILER="D:/bit/QT/QtCreator/Tools/mingw1310_64/bin/gcc.exe" -DCMAKE_CXX_COMPILER="D:/bit/QT/QtCreator/Tools/mingw1310_64/bin/g++.exe" -DCMAKE_AR="D:/bit/QT/QtCreator/Tools/mingw1310_64/bin/ar.exe" -DCMAKE_RANLIB="D:/bit/QT/QtCreator/Tools/mingw1310_64/bin/ranlib.exe" -DBUILD_SHARED_LIBS=OFF ..
bash 复制代码
mingw32-make
bash 复制代码
mingw32-make install

接着看C:\Program Files (x86)下是否有taglib文件夹,(默认就是在这里生成的,如果不是,请仔细看cmake生成的日志),文件夹内容如下

其中./include/taglib/存放的是.h文件,./lib/存放的是.a文件(注意,如果你使用的Qt套件是MSVC的,应该是.lib文件),下面两点需要注意

  • tag.libtag_c.lib是MSVC格式的静态库(.lib扩展名)
  • MinGW无法直接链接MSVC编译的库,必须使用MinGW编译的.a格式库

2. 下载zlib

taglib库需要使用该库,如果没安装请先把它安装,后面是地址,安装方式与前面一模一样
madler/zlib: A massively spiffy yet delicately unobtrusive compression library.

3. 修改.pro文件

创建一个基于Widget的项目,打开.pro文件,内容如下

cpp 复制代码
QT += core gui widgets
CONFIG += c++17

DEFINES += TAGLIB_STATIC  # 关键定义, 只使用静态库

SOURCES += main.cpp widget.cpp
HEADERS += widget.h
FORMS += widget.ui

INCLUDEPATH += "C:/Program Files (x86)/taglib/include"
LIBS += -L"C:/Program Files (x86)/taglib/lib" -ltag -ltag_c

INCLUDEPATH += "C:/Program Files (x86)/zlib/include"
LIBS += -L"C:/Program Files (x86)/zlib/lib" -lz

导入完毕后重新构建一下项目

4. 测试代码

widget.cpp如下

cpp 复制代码
#include "widget.h"
#include <QFileDialog>
#include <QUrl>
#include "taglib/fileref.h"
#include "taglib/tag.h"
#include "ui_widget.h"

Widget::Widget(QWidget* parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    tag_lib_for_test();
}

void Widget::tag_lib_for_test()
{
    auto            music_url = QFileDialog::getOpenFileUrl(this, "选择要上传的歌曲");
    std::wstring    wpath     = music_url.toLocalFile().toStdWString(); // 使用宽字符路径解决Windows中文路径问题
    TagLib::FileRef file(wpath.c_str());
    if (!file.isNull() && file.tag()) {
        TagLib::Tag*             tag        = file.tag();
        TagLib::AudioProperties* properties = file.audioProperties();
        QString                  title      = QString::fromStdWString(tag->title().toWString());
        QString                  artist     = QString::fromStdWString(tag->artist().toWString());
        QString                  album      = QString::fromStdWString(tag->album().toWString());
        QString                  year       = QString::number(tag->year());
        int                      duration   = properties->lengthInMilliseconds();
        qDebug() << "Title:" << title;
        qDebug() << "Artist:" << artist;
        qDebug() << "Album:" << album;
        qDebug() << "Year:" << year;
        qDebug() << "Duration:" << duration << "milliseconds";
    }
}

Widget::~Widget()
{
    delete ui;
}

运行结果如下,当你选中某一个歌曲:


PS:导入过程一波三折,我最开始使用Visual Studio来编译改库,生成的是.lib文件,结果当然是根本不能运行,后面换成.a还是不行,后来发现之前编译的zlib库还是.lib文件,于是又用mingw重新编译了一下。结果还是不行,当时真的崩溃了(╯‵□′)╯︵┻━┻,询问AI后发现需要指定使用mingw编译器,而且还需要加上BUILD_SHARED_LIBS=OFF这个选项,将两个库重新编译了一下,终于,报错没有了,程序跑起来了。一切都是mingw和msvc不兼容的原因,太折磨了,于是写这篇文章,避免以后踩坑。

参考文章:

  1. Qt使用Taglib库读取mp3文件标签信息_qt taglib-CSDN博客
  2. Windows中zlib的安装与配置_zlib windows-CSDN博客
  3. Qt调用第三方库的通用方式(静态链接库.a或.lib、动态链接库.dll)_qt引入第三方库-CSDN博客
相关推荐
时光呢12 分钟前
JAVA泛型擦除原理
java·开发语言
byte轻骑兵3 小时前
【C++进阶】函数:深度解析 C++ 函数的 12 大进化特性
开发语言·c++
老狼孩111223 小时前
2025新版懒人精灵零基础安装调试+lua基础+UI设计交互+常用方法封装+项目实战+项目打包安装板块-视频教程(初学者必修课)
android·开发语言·自动化测试·lua·脚本开发·懒人精灵·免root
安然无虞3 小时前
31天Python入门——第10天:深入理解值传递·引用传递以及深浅拷贝问题
开发语言·后端·python·pyqt
man20174 小时前
基于java的ssm+JSP+MYSQL的九宫格日志网站(含LW+PPT+源码+系统演示视频+安装说明)
java·开发语言·mysql
難釋懷4 小时前
JavaScript基础-删除事件(解绑事件)
开发语言·前端·javascript
背藏玫瑰4 小时前
div用contenteditable属性写一个输入框且敏感词显示
开发语言·前端·javascript·敏感词·contenteditable
White graces4 小时前
解决Selenium滑动页面到指定元素,点击失效的问题
java·开发语言·前端·javascript·selenium·测试工具
郝YH是人间理想4 小时前
Python网络编程入门
运维·服务器·开发语言·网络·python
千里码aicood4 小时前
【2025】基于python+flask的在线考试系统(源码、万字文档、图文修改、调试答疑)
开发语言·python·flask