在 Windows 上将 TagLib 编译成 Qt C++ 项目
Posted
技术标签:
【中文标题】在 Windows 上将 TagLib 编译成 Qt C++ 项目【英文标题】:Compiling TagLib into Qt C++ Project on Windows 【发布时间】:2010-10-05 03:45:15 【问题描述】:我目前正在尝试从 C# 迁移并通过使用 Qt / C++ 摆脱我的平台界限。
我在旧项目中使用 TagLibSharp,但我现在尝试使用此处找到的原始 C++ 源代码:
http://developer.kde.org/~wheeler/taglib.html
试图将它编译到我的应用程序中时,我感到很痛苦。大多数基于 Linux 的 C++ 对我来说都是胡言乱语,我不知道如何正确地将这个库包含到我的 Qt 项目中。我的大部分工作都在使用 Qt Creator(尽我所能)。
谁能指点我一些有用的教程或指南?任何能帮助我理解我什至用这个来源做什么的东西都将不胜感激。我对 C# 和 Windows 编程有非常透彻的了解,但我对这些类型的开源项目所做的工作并不完全了解。
谢谢!
编辑 - 答案就在这里 我决定发布另一个更精致的问题。
Compiling static TagLib 1.6.3 libraries for Windows
一些较旧的编辑...
我现在已经用 Qt 编译了 TagLib,但遇到了“未定义的引用”错误。
*.pro
INCLUDEPATH += ../$$TARGET/taglib-win32
LIBS += -L"..\\$$TARGET\\taglib-win32"
LIBS += -llibtag #It seems to want this to be a *.dll, not a *.a?
DEFINES += TAGLIB_NO_CONFIG
*.cpp
#include <tag.h>
#include <fileref.h>
...
//None of these work, even though they are similar to examples given in TagLib source.
TagLib::FileRef f("03.flac");
TagLib::String test = f.tag()->album();
TagLib::FileName *n = new TagLib::FileName("test");
TagLib::FileRef *f = new TagLib::FileRef();
以下是一些确切错误的示例:
./debug\mythread.o:C:\Users\jocull\Documents\My Dropbox\Code\QT\QtTrayTime-build-desktop/../QtTrayTime/mythread.cpp:20: undefined reference to `_imp___ZN6TagLib7FileRefC1ENS_8FileNameEbNS_15AudioProperties9ReadStyleE'
./debug\mythread.o:C:\Users\jocull\Documents\My Dropbox\Code\QT\QtTrayTime-build-desktop/../QtTrayTime/mythread.cpp:21: undefined reference to `_imp___ZNK6TagLib7FileRef3tagEv'
./debug\mythread.o:C:\Users\jocull\Documents\My Dropbox\Code\QT\QtTrayTime-build-desktop/../QtTrayTime/mythread.cpp:42: undefined reference to `_imp___ZN6TagLib6StringD1Ev'
./debug\mythread.o:C:\Users\jocull\Documents\My Dropbox\Code\QT\QtTrayTime-build-desktop/../QtTrayTime/mythread.cpp:42: undefined reference to `_imp___ZN6TagLib7FileRefD1Ev'
collect2: ld returned 1 exit status
使用 g++ (Mac/Linux) 的命令行步骤
-
./configure --enable-shared=false --enable-static=true
制作
???未创建 *.a 或 *.lib 文件
【问题讨论】:
【参考方案1】:为了将来参考,请查看this post。我已经概述了如何通过 Windows 7 QtCreator 编译 TagLib。
【讨论】:
谢谢。这对尝试这样做的人非常有帮助。 答案中的链接已失效。将您的链接更改为活动链接:joelverhagen.com/blog/2010/11/how-to-compile-taglib-on-windows 修复了链接。谢谢。【参考方案2】:如果您不熟悉 C++ 编程,则必须掌握几个问题才能完成任务:
源文件 (*.cpp
) 包含实际的源代码,而头文件 (*.h
) 只声明源文件中的内容。您必须在源文件中包含所有使用其他源文件中的类/函数/变量的标头。
您需要了解预处理器的工作原理。 AFAIK C# 没有。***文章应该给你一个很好的概述:http://en.wikipedia.org/wiki/C_preprocessor
假设您想将 TagLib 用作动态库,您必须创建一个 Qt 项目,以便将 TagLib 构建为 .dll(.pro 文件指令TEMPLATE=lib
、CONFIG+=dll
)
如果要从源文件中创建动态库,则必须将以后要使用的函数标记为可导出。在 TagLib 中,这是通过定义预处理器宏 MAKE_TAGLIB_LIB
来完成的(在您的 taglib .pro 文件中:DEFINES+=MAKE_TAGLIB_LIB
)
然后您必须构建动态库(在您的 pro 文件中:TEMPLATE=lib
,然后添加 taglib 的所有源和标头)。当您使用 gcc 时,这将产生两个文件 TagLib.dll
和 libTagLib.a
。
在构建应用程序时,您必须在源代码中包含 TagLib 的头文件并告知编译器该库的相关信息(在您的 .pro 文件中:LIBS+=libTagLib.a
)
在您的代码中,您只需包含库中的头文件。假设你想在源文件中使用TagLib::Tag
,那么你必须#include <taglib/tag.h>
;您还必须告诉编译器(准确地说是预处理器)在哪里可以找到taglib
目录。在您的 .pro 文件中,您可以通过添加 INCLUDEPATH+=/path/to/taglib
来执行此操作。
这些是要点,并不是对你必须做什么的深入解释。如果您在实现这一点时遇到问题,请提出更详细的问题。
更多信息请查看 qmake 手册:http://doc.trolltech.com/4.6/qmake-variable-reference.html#libs
【讨论】:
感谢您的回复。我了解 h/cpp 并且我主要获得预处理器(我有一些 Obj-C 经验)。 TagLib 实际上带有一个 *.pro 文件,经过一些调整后,我得到了编译。 (它有一些错误,但我认为它与配置有关。)您推荐的配置有点不同,但我认为它对于 Windows 可能更正确。无论如何,我能够生成一个 libTagLib.a 并将其添加到我的 *.pro 文件中。但是我不确定如何在我的代码中引用这个文件。你有关于如何在 Qt 的 C++ 中使用外部库的更多细节吗? 我必须拥有 *.h 文件和 *.lib 文件吗?这不是违背了编译库的目的吗? 其实我有一个*.a,而不是*.lib。 有一个 .a 文件:完美。这就是 gcc 所需要的。 .h 文件只声明类和方法,而不是它们的实现方式。所以,是的,你需要它们并且你需要#include 它们。不,这不会违背编译库的目的,因为其中不包含“生产”代码。以上是关于在 Windows 上将 TagLib 编译成 Qt C++ 项目的主要内容,如果未能解决你的问题,请参考以下文章
无法在命令行上将 Netbeans 生成的 .java 文件编译成 .class