【问题标题】:Compiling TagLib into Qt C++ Project on Windows在 Windows 上将 TagLib 编译成 Qt C++ 项目
【发布时间】: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) 的命令行步骤

  1. ./configure --enable-shared=false --enable-static=true
  2. 制作
  3. ???未创建 *.a 或 *.lib 文件

【问题讨论】:

    标签: c++ qt qt-creator taglib


    【解决方案1】:

    为了将来参考,请查看this post。我已经概述了如何通过 Windows 7 QtCreator 编译 TagLib。

    【讨论】:

    【解决方案2】:

    如果您不熟悉 C++ 编程,则必须掌握几个问题才能完成任务:

    • 源文件 (*.cpp) 包含实际的源代码,而头文件 (*.h) 只声明源文件中的内容。您必须在源文件中包含所有使用其他源文件中的类/函数/变量的标头。
    • 您需要了解预处理器的工作原理。 AFAIK C# 没有。维基百科文章应该给你一个很好的概述:http://en.wikipedia.org/wiki/C_preprocessor
    • 假设您想将 TagLib 用作动态库,您必须创建一个 Qt 项目,以便将 TagLib 构建为 .dll(.pro 文件指令TEMPLATE=libCONFIG+=dll
    • 如果要从源文件中创建动态库,则必须将以后要使用的函数标记为可导出。在 TagLib 中,这是通过定义预处理器宏 MAKE_TAGLIB_LIB 来完成的(在您的 taglib .pro 文件中:DEFINES+=MAKE_TAGLIB_LIB
    • 然后您必须构建动态库(在您的 pro 文件中:TEMPLATE=lib,然后添加 taglib 的所有源和标头)。当您使用 gcc 时,这将产生两个文件 TagLib.dlllibTagLib.a
    • 在构建应用程序时,您必须在源代码中包含 TagLib 的头文件并告知编译器该库的相关信息(在您的 .pro 文件中:LIBS+=libTagLib.a
    • 在您的代码中,您只需包含库中的头文件。假设你想在源文件中使用TagLib::Tag,那么你必须#include &lt;taglib/tag.h&gt;;您还必须告诉编译器(准确地说是预处理器)在哪里可以找到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 它们。不,这不会违背编译库的目的,因为其中不包含“生产”代码。
    猜你喜欢
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    相关资源
    最近更新 更多