2

我目前正在尝试从 C# 迁移并通过使用 Qt / C++ 摆脱我的平台边界。

我在旧项目中使用了 TagLibSharp,但我现在尝试使用此处找到的原始 C++ 源代码:

http://developer.kde.org/~wheeler/taglib.html

试图将其编译到我的应用程序中,我陷入了痛苦的世界。大多数基于 Linux 的 C++ 对我来说都是胡言乱语,我不知道如何正确地将这个库包含到我的 Qt 项目中。我的大部分工作都在使用 Qt Creator(尽我所能)。

谁能指点我一些有用的教程或指南?任何能帮助我理解我什至用这个来源做什么的东西都将不胜感激。我对 C# 和 Windows 编程有非常透彻的了解,但我并不能很好地掌握我正在使用这些类型的开源项目做什么。

谢谢!

编辑 - 答案在这里 我决定发布另一个更精致的问题。

为 Windows 编译静态 TagLib 1.6.3 库

一些较旧的编辑...

我现在用 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 文件
4

2 回答 2

3

以供将来参考,请查看此帖子。我已经概述了如何通过 Windows 7 QtCreator 编译 TagLib。

于 2010-11-15T18:28:59.303 回答
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 <taglib/tag.h>;您还必须告诉编译器(准确地说是预处理器)它可以在哪里找到该taglib目录。在您的 .pro 文件中,您可以通过添加INCLUDEPATH+=/path/to/taglib.

这些是重点,并不是对您必须做什么的深入解释。如果您在实现这一点时遇到问题,请提出更详细的问题。

有关更多信息,请查看 qmake 手册:http ://doc.trolltech.com/4.6/qmake-variable-reference.html#libs

于 2010-10-05T08:52:55.640 回答