Компиляция TagLib в проект Qt C ++ в Windows - PullRequest
2 голосов
/ 05 октября 2010

В настоящее время я пытаюсь перейти от C # и освободиться от границ моей платформы, используя Qt / C ++.

Я использовал TagLibSharp в моем старом проекте, но сейчас я пытаюсь использоватьоригинальный источник C ++ найден здесь:

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

Я нахожусь в мире боли, пытаясь скомпилировать это в моем приложении.Большая часть этого C ++ на основе Linux для меня бессмысленна, и я не знаю, как правильно включить эту библиотеку в мой проект с Qt.Я использую Qt Creator для большей части моей работы (все, что я могу).

Может кто-нибудь подсказать мне несколько полезных руководств или руководств?Все, что поможет мне понять, что я даже делаю с этим источником, будет с благодарностью.У меня есть очень глубокое понимание программирования на C # и Windows, но я не совсем понимаю, что я делаю с этими типами проектов с открытым исходным кодом.

Спасибо!

РЕДАКТИРОВАТЬ - ОТВЕТ ЗДЕСЬ Я решил опубликовать еще один вопрос, который был для него более точным.

Компиляция статических библиотек TagLib 1.6.3 для Windows

Некоторые старые правки ...

Теперь у меня есть TagLib, скомпилированный с Qt, но я сталкиваюсь с ошибками "Неопределенная ссылка".

*. 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 не созданы

Ответы [ 2 ]

3 голосов
/ 15 ноября 2010

Для дальнейшего использования, проверьте этот пост . Я описал, как я скомпилировал TagLib через Windows 7 QtCreator.

2 голосов
/ 05 октября 2010

Если вы новичок в программировании на 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

...