文章目录
- [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.lib
和tag_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不兼容的原因,太折磨了,于是写这篇文章,避免以后踩坑。
参考文章: