Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为Windows编译静态TagLib 1.6.3库_C++_Windows_Qt_Cmake_Taglib - Fatal编程技术网

C++ 为Windows编译静态TagLib 1.6.3库

C++ 为Windows编译静态TagLib 1.6.3库,c++,windows,qt,cmake,taglib,C++,Windows,Qt,Cmake,Taglib,在我的Qt项目中编译和使用TagLib 1.6.3非常困难。我已经尝试了我能想到的一切。TagLib声称它是通过CMake支持的,但我没有任何运气。此外,我对Qt库需要什么样的文件感到困惑 我构建了*.a文件、*.lib和*.dll。据我目前所知。。。我相信,既然我在Windows*下工作,.lib就是我想要的。无论我做什么,当我试图编译我的Qt项目时,我总是以“未定义的引用”结束对我试图使用的任何TagLib函数的引用。我尝试过MinGW32、MSYS、VisualStudio2008,甚至在

在我的Qt项目中编译和使用TagLib 1.6.3非常困难。我已经尝试了我能想到的一切。TagLib声称它是通过CMake支持的,但我没有任何运气。此外,我对Qt库需要什么样的文件感到困惑

我构建了*.a文件、*.lib和*.dll。据我目前所知。。。我相信,既然我在Windows*下工作,.lib就是我想要的。无论我做什么,当我试图编译我的Qt项目时,我总是以“未定义的引用”结束对我试图使用的任何TagLib函数的引用。我尝试过MinGW32、MSYS、VisualStudio2008,甚至在Linux上为Windows交叉编译。一切都没有结果

对我来说更有意义的是,如果我在Mac上用Qt编译相同的TagLib源代码(我想是g++吧?)!在我的Windows编译过程中,我一定是出了问题。为了弄清楚这一点,我在桌上捶了大约30个小时(断断续续)

既然Qt使用minGW,我必须用相同的编译器编译TagLib吗

如果我使用Visual Studio编译*.lib,它们是否不兼容

*.a库在Windows中是否可用?(假设minGW)

我仍然在尝试处理这个C++的东西,但是在阅读了无数的论坛帖子和其他问题之后,我仍然很短。以下是我目前在CMake工作的内容

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

这将生成一个大小约为2MB的*.a文件。Mac上的工作库约为3MB,Visual Studio中的*.lib在发布模式下约为4MB。请有人把我从这个C++跨平台命令行中解救出来,因为我的智慧已经结束了。我甚至会付钱给你,让你给我编译一些%$#&图书馆。谢谢。

既然Mac适合你,我就说Win32

好的,这是我的Taglib.pro和我的project.pro的摘录:。看看他们。我的Taglib可能有点过时,所以请小心,您可能丢失了一些文件。还要注意相对路径。它们都是相对于.pro文件的

我刚刚在taglib目录中运行了
cmake.
。这将导致
config.h
taglib\u config.h

当您使用QtCreator和mingw gcc.*时,您肯定只需要
libTaglib.a
。库是MSVC特有的

这详细说明了本线程中描述的整个过程


博客作者Joel很好地提供了针对windows的编译版本。

我在项目中使用了cmake。这是我制作的使用taglib的媒体播放器的cmake文件。我将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}很重要。
希望这对某人有所帮助。

这是一个很好的信息,谢谢。在过去,我一直在将所有*.h文件粉碎到一个目录中,以便使用INCLUDEPATH进行管理。这是不对的吗?此外,我还没有包括DEPENDPATH,因为我不知道我需要它。老实说,我不确定你是否需要DEPENDPATH,但这也没有坏处。由于TagLib本身依赖于正确的Include路径,所以将所有.h文件粉碎到一个目录不是一个好主意,但这不是链接器问题的根源!对此我不是100%确定:您正在将TagLib编译为共享库,但您的链接器会抱怨一些符号。确保链接器知道TagLib中的符号是动态加载的,而不是静态加载的!确保编译程序时没有定义
TAGLIB\u STATIC
Make\u TAGLIB\u LIB
。仔细阅读
taglib_export.h
,因为此文件是导出或导入符号的关键点。创建.dll和.a文件时,您将创建一个共享资源。要将TagLib静态(即直接)链接到二进制文件中,只需将TagLib的源添加到.pro文件中(使用
sources
)并定义
TagLib\u STATIC
。很高兴听到这个消息。尝试将
TagLib.dll
复制到与QtTrayTime.exe相同的目录中。