2010-10-07 14 views
6

Tengo un tiempo extremadamente difícil para compilar y usar TagLib 1.6.3 en mi proyecto de Qt. He intentado todo lo que puedo pensar. TagLib afirma que es compatible a través de CMake, pero no estoy teniendo suerte. Además, estoy confundido sobre qué tipos de archivos necesito para mis Qt libs.Compilación de bibliotecas estáticas de TagLib 1.6.3 para Windows

He creado * .a archivos, * .lib y * .dll. Por lo que entiendo hasta ahora ... Creo que dado que estoy trabajando en Windows * .lib es lo que quiero. No importa lo que haga, siempre termino con "referencias indefinidas" a cualquier función de TagLib que trato de usar cuando intento compilar mi proyecto de Qt. He probado MinGW32, MSYS, Visual Studio 2008 e incluso compilación cruzada para Windows en Linux. Todo no aparece nada.

Lo que tiene aún menos sentido para mí es que si compilo la misma fuente de TagLib con Qt en Mac (¿g ++ creo?) ¡Funciona bien! En alguna parte de mis procedimientos de compilación de Windows tengo que estar yendo mal. He estado golpeando mi cara en mi escritorio probablemente durante unas 30 (horas de encendido y apagado) tratando de resolver esto.

Dado que Qt usa minGW, ¿debo compilar TagLib con el mismo compilador?

Si compilo * .lib con Visual Studio, ¿no son compatibles?

¿Las bibliotecas * .a se pueden usar incluso en Windows? (suponiendo minGW)

Todavía estoy tratando de manejar estas cosas en C++, pero después de leer innumerables temas en el foro y otras preguntas, todavía me estoy quedando corto. Aquí es lo que he estado trabajando con CMake en la actualidad ...

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

Esto genera un único archivo .a * de ~ 2 MB de tamaño. La biblioteca de trabajo en Mac era ~ 3MB, y la * .lib de Visual Studio era ~ 4MB en modo Release. Por favor, alguien, sálvame de esta locura de línea de comando de C++ plataforma cruzada porque estoy al final de mi ingenio. Probablemente incluso le pagaría por compilar algunas bibliotecas%! $ # & ing. Gracias.

Respuesta

3

Dado que Mac funciona para usted, solo estoy hablando de Win32.

Bien, este es mi Taglib.pro y un extracto de mi project.pro: https://gist.github.com/449ea81ce92f52399f41. Échales un vistazo. Mi Taglib puede estar un poco desactualizado, así que tenga cuidado, algunos archivos que pueda tener pueden estar desaparecidos allí. Cuide también los caminos relativos. Todos son relativos al archivo .pro.

Acabo de ejecutar cmake . dentro del directorio taglib. Esto debería dar como resultado un config.h y un taglib_config.h

Definitivamente solo necesita el libTaglib.a cuando usa QtCreator y mingw-gcc. * .lib son específicos de MSVC!

+0

Esta es una gran información para tener, gracias. En el pasado, he estado destruyendo todos los archivos * .h en un directorio para mi INCLUDEPATH para que sea más fácil de administrar. ¿Es esto incorrecto? Además, no he incluido DEPENDPATH porque no sabía que lo necesitaba. – jocull

+0

Para ser sincero, no estoy seguro de si necesitas DEPENDPATH, pero tampoco me duele. Ya que TagLib depende de las rutas de inclusión adecuadas, ¡destruir todos los archivos .h en un solo directorio no es una buena idea, pero no es el origen de su problema de vinculador! – WolfgangA

+1

No estoy 100% seguro de esto: está compilando TagLib como una biblioteca compartida, pero su enlazador se queja de algunos símbolos. ¡Asegúrate de que tu enlazador sepa que los símbolos de TagLib están _dynamically_ cargados, no _statically_! Asegúrese de ** no ** haber definido 'TAGLIB_STATIC' ** ni **' MAKE_TAGLIB_LIB' al compilar su programa. Lea 'taglib_export.h' con cuidado ya que este archivo es el punto fundamental para exportar o importar símbolos. – WolfgangA

2

Este blog post detalla todo el proceso descrito en este hilo.

El autor de la publicación del blog, Joel, fue lo suficientemente agradable para proporcionar el binaries of taglib 3.6.3 compilado para Windows.

1

Uso cmake para mis proyectos. Aquí está mi archivo de cmake para un reproductor de medios que hice que usa taglib. Instalé taglib en/usr/local/(de esta manera no tengo que cambiar nada cuando compilo en Linux). Las partes importantes tienen una flecha.

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}) 

El último, solo $ {TAGLIB_LIB} es importante. espero que ayude a alguien.

Cuestiones relacionadas