将TagLib编译成Qt C++;Windows上的项目 我目前正试图通过QT/C++来从C语言中摆脱我的平台边界, 我在旧项目中使用了TaLIbBASH,但我现在尝试使用这里找到的原始C++源:

将TagLib编译成Qt C++;Windows上的项目 我目前正试图通过QT/C++来从C语言中摆脱我的平台边界, 我在旧项目中使用了TaLIbBASH,但我现在尝试使用这里找到的原始C++源:,c++,qt,qt-creator,taglib,C++,Qt,Qt Creator,Taglib,试图将其编译到我的应用程序中,我感到非常痛苦。大多数基于Linux的C++对我来说是胡言乱语,我不知道如何用QT将这个库适当地包含到我的项目中。我的大部分工作都在使用QtCreator(尽我所能) 有人能给我指一些有用的教程或指南吗?任何能帮助我理解我使用这个资源所做的事情都将不胜感激。我对C#和Windows编程有着非常透彻的理解,但我对这些类型的开源项目的处理并不十分清楚 谢谢 编辑-答案在这里 我决定发布另一个问题,这是一个更完善的 一些较旧的编辑… 我现在用Qt编译了TagLib,但遇

试图将其编译到我的应用程序中,我感到非常痛苦。大多数基于Linux的C++对我来说是胡言乱语,我不知道如何用QT将这个库适当地包含到我的项目中。我的大部分工作都在使用QtCreator(尽我所能)

有人能给我指一些有用的教程或指南吗?任何能帮助我理解我使用这个资源所做的事情都将不胜感激。我对C#和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();
使用g++(Mac/Linux)的命令行步骤

  • ./configure--enable shared=false--enable static=true
  • 制造
  • ???未创建*.a或*.lib文件

  • 如果你对C++编程很陌生,你需要掌握几个问题来完成你的任务:

    • 源文件(
      *.cpp
      )包含实际的源代码,而头文件(
      *.h
      )只声明源文件中的内容。必须在源文件中包含使用其他源文件中的类/函数/变量的所有头文件
    • 您需要了解预处理器是如何工作的。AFAIK C#没有。维基百科的文章应该给你一个很好的概述:
    • 假设您想将TagLib用作动态库,则必须创建一个Qt项目,以便仅将TagLib构建为.dll(.pro file directions
      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
      ,那么您必须
      #包含
      ;您还必须告诉编译器(确切地说:预处理器)在哪里可以找到
      taglib
      目录。在.pro文件中,可以通过添加
      INCLUDEPATH+=/path/to/taglib
      来实现这一点
    这些都是要点,并不是对你必须做什么的深入解释。如果您在意识到这一点时遇到问题,请提出更详细的问题


    有关更多信息,请参阅qmake手册:

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

    感谢您的回复。我了解h/cpp,并且我主要使用预处理器(我有一些Obj-C经验)。TagLib实际上附带了一个*.pro文件,经过一些调整后,我将其编译。(它有一些错误,但我认为它与配置有关。)您建议的配置有点不同,但我认为它可能更适合Windows。无论如何,我能够生成一个libTagLib.a,并将其添加到我的*.pro文件中。但是,我不确定如何在代码中引用此文件。关于QT C++中如何使用外部库,你有什么额外的细节吗?我必须要有*.h文件以及*.LIB吗?这不是违背了编译库的目的吗?实际上我有一个*.a,而不是*.lib。我有一个.a文件:完美。这就是gcc需要的。一个.h文件只是声明类和方法,而不是它们的实现方式。所以,是的,你需要它们,你需要把它们包括在内。不,这并不违背编译库的目的,因为其中不包含“高效”代码。谢谢。这将非常有助于人们尝试这样做。答案中的链接已失效。将链接更改为活动链接:已修复链接。谢谢
    ./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