Qt5 - 链接pHash库"未定义参考"

时间:2015-10-07 16:16:56

标签: c++ qt phash

我想添加一个名为pHash的外部库。我将此添加到.pro文件中:

win32:CONFIG(release, debug|release): LIBS += -L$PWD/Libs/pHash-0.9.4/release -lpHash
else:win32:CONFIG(debug, debug|release): LIBS += -L$PWD/Libs/pHash-0.9.4/debug -lpHash

INCLUDEPATH += $PWD/Libs/pHash-0.9.4
DEPENDPATH += $PWD/Libs/pHash-0.9.4

win32:CONFIG(release, debug|release): PRE_TARGETDEPS += $PWD/Libs/pHash-0.9.4/release/pHash.lib
else:win32:CONFIG(debug, debug|release): PRE_TARGETDEPS += $PWD/Libs/pHash-0.9.4/debug/pHash.lib

但是该库的任何功能都没有起作用。当我尝试使用一个时,我会产生错误"对pHashFunction"的未定义引用。有一个使用的例子:

#include "myclass.h"

#define HAVE_IMAGE_HASH 1 // config
#include "pHash.h"

void MyClass::perform() {
    const char *msg = ph_about();
    qDebug() << msg;
}

然后是构建日志:

C:/Qt/Tools/mingw492_32/bin/mingw32-make -f Makefile.Debug clean
mingw32-make[1]: Entering directory 'C:/Users/vi/Documents/Programmation/QtWorkspace/build-myProject-Desktop_Qt_5_5_0_MinGW_32bit-Debug'
rm -f debug/qrc_qml.cpp
rm -f debug/moc_myclass.cpp
rm -f debug/main.o debug/myclass.o debug/qrc_qml.o debug/moc_myclass.o
mingw32-make[1]: Leaving directory 'C:/Users/vi/Documents/Programmation/QtWorkspace/build-myProject-Desktop_Qt_5_5_0_MinGW_32bit-Debug'
C:/Qt/Tools/mingw492_32/bin/mingw32-make -f Makefile.Release clean
mingw32-make[1]: Entering directory 'C:/Users/vi/Documents/Programmation/QtWorkspace/build-myProject-Desktop_Qt_5_5_0_MinGW_32bit-Debug'
rm -f release/qrc_qml.cpp
rm -f release/moc_myclass.cpp
rm -f release/main.o release/myclass.o release/qrc_qml.o release/moc_myclass.o
mingw32-make[1]: Leaving directory 'C:/Users/vi/Documents/Programmation/QtWorkspace/build-myProject-Desktop_Qt_5_5_0_MinGW_32bit-Debug'
01:31:34: Le processus "C:\Qt\Tools\mingw492_32\bin\mingw32-make.exe" s'est terminé normalement.
01:31:34: Configuration inchangée, étape qmake sautée.
01:31:34: Débute : "C:\Qt\Tools\mingw492_32\bin\mingw32-make.exe" 
C:/Qt/Tools/mingw492_32/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory 'C:/Users/vi/Documents/Programmation/QtWorkspace/build-myProject-Desktop_Qt_5_5_0_MinGW_32bit-Debug'
g++ -c -pipe -fno-keep-inline-dllexport -g -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -I../myProject -I. -I../myProject/Libs/pHash-0.9.4 -IC:/Qt/5.5/mingw492_32/include -IC:/Qt/5.5/mingw492_32/include/QtQuick -IC:/Qt/5.5/mingw492_32/include/QtGui -IC:/Qt/5.5/mingw492_32/include/QtANGLE -IC:/Qt/5.5/mingw492_32/include/QtQml -IC:/Qt/5.5/mingw492_32/include/QtNetwork -IC:/Qt/5.5/mingw492_32/include/QtCore -Idebug -IC:/Qt/5.5/mingw492_32/mkspecs/win32-g++  -o debug/main.o ../myProject/main.cpp
g++ -c -pipe -fno-keep-inline-dllexport -g -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -I../myProject -I. -I../myProject/Libs/pHash-0.9.4 -IC:/Qt/5.5/mingw492_32/include -IC:/Qt/5.5/mingw492_32/include/QtQuick -IC:/Qt/5.5/mingw492_32/include/QtGui -IC:/Qt/5.5/mingw492_32/include/QtANGLE -IC:/Qt/5.5/mingw492_32/include/QtQml -IC:/Qt/5.5/mingw492_32/include/QtNetwork -IC:/Qt/5.5/mingw492_32/include/QtCore -Idebug -IC:/Qt/5.5/mingw492_32/mkspecs/win32-g++  -o debug/myclass.o ../myProject/myclass.cpp
In file included from ../myProject/myclass.cpp:3:0:
../myProject/Libs/pHash-0.9.4/pHash.h:299:21: warning: 'cimg_library::CImg<float>* ph_dct_matrix(int)' declared 'static' but never defined [-Wunused-function]
 static CImg<float>* ph_dct_matrix(const int N);
                     ^
'C:\Qt\5.5\mingw492_32\bin\rcc.exe' -name qml ../myProject/qml.qrc -o debug/qrc_qml.cpp
g++ -c -pipe -fno-keep-inline-dllexport -g -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -I../myProject -I. -I../myProject/Libs/pHash-0.9.4 -IC:/Qt/5.5/mingw492_32/include -IC:/Qt/5.5/mingw492_32/include/QtQuick -IC:/Qt/5.5/mingw492_32/include/QtGui -IC:/Qt/5.5/mingw492_32/include/QtANGLE -IC:/Qt/5.5/mingw492_32/include/QtQml -IC:/Qt/5.5/mingw492_32/include/QtNetwork -IC:/Qt/5.5/mingw492_32/include/QtCore -Idebug -IC:/Qt/5.5/mingw492_32/mkspecs/win32-g++  -o debug/qrc_qml.o debug/qrc_qml.cpp
'C:\Qt\5.5\mingw492_32\bin\moc.exe' -DUNICODE -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -D__GNUC__ -DWIN32 -IC:/Qt/5.5/mingw492_32/mkspecs/win32-g++ -IC:/Users/vi/Documents/Programmation/QtWorkspace/myProject -IC:/Users/vi/Documents/Programmation/QtWorkspace/myProject/Libs/pHash-0.9.4 -IC:/Qt/5.5/mingw492_32/include -IC:/Qt/5.5/mingw492_32/include/QtQuick -IC:/Qt/5.5/mingw492_32/include/QtGui -IC:/Qt/5.5/mingw492_32/include/QtANGLE -IC:/Qt/5.5/mingw492_32/include/QtQml -IC:/Qt/5.5/mingw492_32/include/QtNetwork -IC:/Qt/5.5/mingw492_32/include/QtCore -I. ../myProject/myclass.h -o debug/moc_myclass.cpp
g++ -c -pipe -fno-keep-inline-dllexport -g -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -I../myProject -I. -I../myProject/Libs/pHash-0.9.4 -IC:/Qt/5.5/mingw492_32/include -IC:/Qt/5.5/mingw492_32/include/QtQuick -IC:/Qt/5.5/mingw492_32/include/QtGui -IC:/Qt/5.5/mingw492_32/include/QtANGLE -IC:/Qt/5.5/mingw492_32/include/QtQml -IC:/Qt/5.5/mingw492_32/include/QtNetwork -IC:/Qt/5.5/mingw492_32/include/QtCore -Idebug -IC:/Qt/5.5/mingw492_32/mkspecs/win32-g++  -o debug/moc_myclass.o debug/moc_myclass.cpp
g++ -Wl,-subsystem,windows -mthreads -o debug/myProject.exe debug/main.o debug/myclass.o debug/qrc_qml.o debug/moc_myclass.o  -lmingw32 -LC:/Qt/5.5/mingw492_32/lib -lqtmaind -lshell32 -LC:/Users/vi/Documents/Programmation/QtWorkspace/myProject/Libs/pHash-0.9.4/debug -lpHash -lQt5Quickd -lQt5Guid -lQt5Qmld -lQt5Networkd -lQt5Cored 
debug/myclass.o: In function `ZN6myclass7performEv':
C:\Users\vi\Documents\Programmation\QtWorkspace\build-myProject-Desktop_Qt_5_5_0_MinGW_32bit-Debug/../myProject/myclass.cpp:11: undefined reference to `ph_about'
collect2.exe: error: ld returned 1 exit status
Makefile.Debug:83: recipe for target 'debug/myProject.exe' failed
mingw32-make[1]: *** [debug/myProject.exe] Error 1
mingw32-make[1]: Leaving directory 'C:/Users/vi/Documents/Programmation/QtWorkspace/build-myProject-Desktop_Qt_5_5_0_MinGW_32bit-Debug'
makefile:34: recipe for target 'debug' failed
mingw32-make: *** [debug] Error 2

提前感谢您的帮助:)

2 个答案:

答案 0 :(得分:1)

尝试将.c和.cpp添加到您在我的电脑上运行的项目(dirent.c,ph_fft.c,pHash.cpp,phcomplex.c),但我认为问题在于.dll和。 lib与您的Qt版本不兼容,因为它是用Visual Studio编译的。

答案 1 :(得分:1)

不再支持库pHash,并且存在许多问题。

  1. Qt使用的编译器MinGW 4.9.2与MSVC中内置的.dll文件不兼容。

  2. 使用诀窍"MSVC and MinGW DLLs"是不够的,因为函数ph_about()未从pHash.dll导出,例如Building the pHash library on Windows

    < / LI>
  3. 可以将所有的pHash文件集成到Qt项目中,因此可以与应用程序一起构建库。由于库项目是为Visual Studio准备的,我会说Qt也应该基于VC。然而,库pHash是旧的。它是为Visual Studio 2008编写的。现在它在已弃用的Windows函数SHGetSpecialFolderPathA上出错。

  4. 使用Qt MinGW 4.9.2编译器编译所有内容仍然是可能的。在这种情况下,需要将DEFINES += HAVE_IMAGE_HASH=1添加到项目.pro文件中,以便为pHash编译启用该宏。但是,要使用对映像的本机支持,库libjpeglibpng也应使用相同的编译器进行编译,例如Compiling libjpeg 如果未使用图像库,Cimg会尝试运行某些外部可执行文件gm.exe(可能来自GraphicsMagick)。

  5. 如果某个快速任务需要库,则可以考虑使用虚拟Linux,因为在这里它可以直接使用https://stackoverflow.com/a/33002746/4023446