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

Мне очень трудно компилировать и использовать TagLib 1.6.3 в моем проекте Qt. Я пробовал все, что мог придумать. TagLib утверждает, что поддерживается через CMake, но мне не повезло. Кроме того, я не понимаю, какие файлы мне вообще нужны для моих библиотек Qt!

Я создал файлы *.a, *.lib и *.dll. Из того, что я понимаю до сих пор... Я считаю, что, поскольку я работаю в Windows, *.lib - это то, что я хочу. Независимо от того, что я делаю, я всегда получаю «неопределенные ссылки» на любые функции TagLib, которые я пытаюсь использовать, когда пытаюсь скомпилировать свой проект Qt. Я пробовал MinGW32, MSYS, Visual Studio 2008 и даже кросс-компиляцию для Windows на Linux. Все ничего не получается.

Что для меня имеет еще меньше смысла, так это то, что если я скомпилирую тот же исходный код TagLib с Qt на Mac (думаю, на g++?), он будет работать нормально! Где-то в моих процедурах компиляции Windows я должен ошибаться. Я бился лицом о стол, наверное, около 30 часов (время от времени), пытаясь понять это.

Поскольку Qt использует minGW, должен ли я компилировать TagLib с тем же компилятором?

Если я скомпилирую *.lib с Visual Studio, они не совместимы?

Можно ли вообще использовать библиотеки *.a в Windows? (при условии минГВт)

Я все еще пытаюсь разобраться с этим материалом на С++, но после прочтения бесчисленных веток форума и других вопросов я все еще не могу. Вот с чем я сейчас работаю в CMake...

cmake -G "MinGW Makefiles" -DENABLE_STATIC=ON -DHAVE_ZLIB=0 -DWITH_MP4=1 -DMAKE_TAGLIB_LIB=1
cmake --build ./

Это создает один файл *.a размером ~ 2 МБ. Рабочая библиотека на Mac весила ~3 МБ, а *.lib из Visual Studio — ~4 МБ в режиме выпуска. Пожалуйста, кто-нибудь, спасите меня от этого безумия кросс-платформенной командной строки C++, потому что я в отчаянии. Я бы, наверное, даже заплатил вам за то, что вы просто скомпилируете мне несколько %!$#& библиотек. Спасибо.


person jocull    schedule 07.10.2010    source источник


Ответы (3)


Поскольку у вас работает Mac, я говорю только о Win32.

Хорошо, это мой Taglib.pro и выдержка из моего проекта.pro: https://gist.github.com/449ea81ce92f52399f41. Проверь их. Моя Taglib может быть немного устаревшей, поэтому будьте осторожны, некоторые файлы, которые у вас могут быть, могут отсутствовать там. Также позаботьтесь об относительных путях. Все они относятся к файлу .pro.

Я только что запустил cmake . внутри каталога taglib. Это должно привести к config.h и taglib_config.h

Вам определенно нужен только libTaglib.a, когда вы используете QtCreator и mingw-gcc. *.lib специфичны для MSVC!

person WolfgangP    schedule 07.10.2010
comment
Это отличная информация, спасибо. В прошлом я разбивал все файлы *.h в один каталог для моего INCLUDEPATH, чтобы упростить управление. Это неправильно? Также я не включал DEPENDPATH, потому что не знал, что мне это нужно. - person jocull; 07.10.2010
comment
Честно говоря, я не уверен, нужен ли вам DEPENDPATH, но это тоже не помешает. Поскольку сама TagLib полагается на правильные пути включения, разбивать все файлы .h в один каталог не очень хорошая идея, но не источник вашей проблемы с компоновщиком! - person WolfgangP; 07.10.2010
comment
Я не уверен в этом на 100%: вы компилируете TagLib как разделяемую библиотеку, но ваш компоновщик жалуется на некоторые символы. Убедитесь, что ваш компоновщик знает, что символы из TagLib загружаются динамически, а не статически! Убедитесь, что вы не определили TAGLIB_STATIC ни MAKE_TAGLIB_LIB при компиляции вашей программы. Внимательно прочитайте taglib_export.h, так как этот файл является ключевой точкой для экспорта или импорта символов. - person WolfgangP; 07.10.2010
comment
Насколько я понимаю, я действительно хочу компилировать TagLib статически, но когда я компилирую свою программу, TagLib теперь считается общим ресурсом. Это правильно? - person jocull; 07.10.2010
comment
Есть ли у вас какие-либо эффективные методы, которые вы используете для экспорта всех файлов *.h в их текущие структуры каталогов? Это бардак, как сейчас. - person jocull; 07.10.2010
comment
Когда вы создаете файлы .dll и .a, вы создаете общий ресурс. Чтобы связать TagLib статически (т.е. напрямую) с вашим двоичным файлом, просто добавьте исходники TagLib в ваш файл .pro (с SOURCES) и определите TAGLIB_STATIC. - person WolfgangP; 07.10.2010
comment
Хорошо, это проясняет, спасибо. В этом случае я сейчас работаю с общей сборкой TagLib. На самом деле я получил его для сборки с Qt (наконец-то), и я настроил его, как вы показали. У меня все компилируется без ошибок, но как только я запускаю, я сразу же получаю сообщение об ошибке: QtTrayTime.exe завершился с кодом -1073741515 ... Из того, что я сделал в Google, я предполагаю, что это означает, что я сделал что-то неправильно при связывании моего общая библиотека. Я сделал Gist того, что у меня есть на данный момент: gist.github.com/615451 - person jocull; 07.10.2010
comment
Рад это слышать. Попробуйте скопировать TagLib.dll в тот же каталог, что и ваш QtTrayTime.exe. - person WolfgangP; 08.10.2010
comment
ААААА РАБОТАЕТ! Ты самый лучший человек, большое спасибо за всю твою помощь. Это было проклятием моего существования в течение нескольких дней. Я должен был подумать об этом (это то, что вы должны делать на С#), но этот материал на С++ довольно сильно бросает меня в тупик. Можете ли вы объяснить мне, почему, поскольку мы определяем такие вещи, как win32:LIBS +=, почему я должен вручную копировать DLL? Является ли LIBS += только для использования компилятором, но мне нужно вручную скопировать DLL для использования .exe? Почему это не так на Mac? - person jocull; 08.10.2010
comment
Благодаря вашей помощи я также смог статически скомпилировать исходные файлы TagLib в свой проект. Это было так же просто, как добавить файлы *.h и *.cpp в мой проект и добавить DEFINES += TAGLIB_STATIC=1. Я также скопировал FRAMEWORK_HEADERS и QMAKE_BUNDLE_DATA для Mac из оригинальной TagLib *.pro. Еще раз спасибо! - person jocull; 08.10.2010

Этот сообщение в блоге подробно описывает все процесс описан в этой теме.

Автор сообщения в блоге, Джоэл, был достаточно любезен, чтобы предоставить бинарные файлы taglib 3.6. .3 скомпилировано для Windows.

person Name is carl    schedule 05.05.2011

Я использую cmake для своих проектов. Вот мой файл cmake для медиаплеера, который я сделал, который использует taglib. Я установил taglib в /usr/local/ (таким образом мне не нужно ничего менять при компиляции в Linux). Важные части отмечены стрелкой.

project(qtmu3)
find_package(Qt4 REQUIRED)
-> find_library(TAGLIB_LIB tag PATH /usr/local/lib/)
set(QT_USE_PHONON TRUE)
set(QTMU_SRCS main.cpp mainwindow.cpp WidgetMarqueeLabel.cpp single_application.cpp)
set(QTMU_MOC_HDRS mainwindow.h WidgetMarqueeLabel.h single_application.h)
set(QTMU_UI_FILES mainwindow.ui)
set(QTMU_RSRC_FILES myresources.qrc)
-> include_directories(/usr/local/include/taglib/)
set(CMAKE_CXX_FLAGS "-mwindows")
include(${QT_USE_FILE})
QT4_WRAP_UI( QTMU_UI_HDRS ${QTMU_UI_FILES})
QT4_WRAP_CPP( QTMU_MOC_SRCS ${QTMU_MOC_HDRS})
QT4_ADD_RESOURCES(QTMU_RSRC_SRCS ${QTMU_RSRC_FILES})
INCLUDE_DIRECTORIES( ${CMAKE_BINARY_DIR} )
ADD_EXECUTABLE(qtmu3 ${QTMU_SRCS} ${QTMU_MOC_SRCS} ${QTMU_RSRC_SRCS} ${QTMU_UI_HDRS})
-> TARGET_LINK_LIBRARIES(qtmu3 ${QT_LIBRARIES} ${TAGLIB_LIB}) 

Последнее, важно только ${TAGLIB_LIB}. надеюсь, что это поможет кому-то.

person Craig    schedule 17.08.2012