在Windows上将TagLib编译为Qt C ++项目

时间:2010-10-05 03:45:15

标签: c++ qt qt-creator taglib

我目前正试图从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,但遇到了“未定义的引用”错误。

*。亲

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文件

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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
  • 来完成的。
  • 然后您必须构建动态库(在您的专业文件中:TEMPLATE=lib,然后添加taglib的所有源和标头)。使用gcc时,这将生成两个文件TagLib.dlllibTagLib.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

相关问题