Can't add HDF5 library in empty Qt-project
-
Hello,
I'm newbie in Qt so please don't get mad about my question (I saw similiar issues in Internet but they didn't help me). I use QtCreator:
MSVC 2017 x64
Windows 7 x64
Qt 5I installed HDF5 library with MSVC 2017 x64. Now I'm trying to create a Qt project and perform example from HDF5 web-syte: link text
Hdf5 library is in: C:\apps\MSVC_apps_debug\HDF5\lib
I add the library to the Qt-project via interactive Qt tool.
I get errors (translated from russian):
main.obj: -1: error: LNK2019: reference to an unresolved external symbol H5check_version in the main function
main.obj: -1: error: LNK2019: reference to an unresolved external symbol H5check_version in the main function
main.obj: -1: error: LNK2001: unresolved external character "" public: static class H5 :: FileAccPropList const & const H5 :: FileAccPropList :: DEFAULT "(? DEFAULT @ FileAccPropList @ H5 @@ 2AEBV12 @ EB)"
etc...
My main.cpp:#include "mainwindow.h" #include <QApplication> /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * * the COPYING file, which can be found at the root of the source code * * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * This example illustrates how to create a dataset that is a 4 x 6 * array. It is used in the HDF5 Tutorial. */ #include <iostream> #include <string> #include "H5Cpp.h" using namespace H5; const H5std_string FILE_NAME("h5tutr_dset.h5"); const H5std_string DATASET_NAME("dset"); const int NX = 4; // dataset dimensions const int NY = 6; const int RANK = 2; int main (void) { // Try block to detect exceptions raised by any of the calls inside it try { // Turn off the auto-printing when failure occurs so that we can // handle the errors appropriately Exception::dontPrint(); // Create a new file using the default property lists. H5File file(FILE_NAME, H5F_ACC_TRUNC); // Create the data space for the dataset. hsize_t dims[2]; // dataset dimensions dims[0] = NX; dims[1] = NY; DataSpace dataspace(RANK, dims); // Create the dataset. DataSet dataset = file.createDataSet(DATASET_NAME, PredType::STD_I32BE, dataspace); } // end of try block // catch failure caused by the H5File operations catch(FileIException error) { error.printErrorStack(); return -1; } // catch failure caused by the DataSet operations catch(DataSetIException error) { error.printErrorStack(); return -1; } // catch failure caused by the DataSpace operations catch(DataSpaceIException error) { error.printErrorStack(); return -1; } return 0; // successfully terminated }
My .ppro-file:
QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++11 # The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main.cpp \ mainwindow.cpp HEADERS += \ mainwindow.h FORMS += \ mainwindow.ui # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../../../../apps/MSVC_apps/HDF5/lib/ -lhdf5_cpp_ else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../../../../apps/MSVC_apps/HDF5/lib/ -lhdf5_cpp_d INCLUDEPATH += $$PWD/../../../../../apps/MSVC_apps/HDF5/include DEPENDPATH += $$PWD/../../../../../apps/MSVC_apps/HDF5/include
-
Seeing the numbers of .dll files in your bin folder, you shall have the same number of .lib files somewhere. I suspect that you are not linking enough of the hdf5 libraries.
-
Hi and welcome to devnet,
Do you have only one library generated for hdf5 or are there several ?
-
Thank you for response,
No, I have several of them! I attach pictures that better represent my current situation.
lib.png -
@Please_Help_me_D said in Can't add HDF5 library in empty Qt-project:
LIBS += -L$$PWD/../../../../../apps/MSVC_apps/HDF5/lib/
For whatever is your PWD (project dir) that path won't match
C:\apps\MSVC_apps_debug\HDF5\lib
-
@Pablo-J-Rogina
That is interesting, thank! Why those path are not equal?
But anyway, I changed those lines to the following:LIBS += -LC:/apps/MSVC_apps_debug/HDF5/ -lhdf5_cpp_D INCLUDEPATH += C:/apps/MSVC_apps_debug/HDF5/include DEPENDPATH += C:/apps/MSVC_apps_debug/HDF5/include
and nothing changed...
-
@Please_Help_me_D Are you sure the missing symbols are in the lib you added? You should check that and add other libs if needed. Also, you added debug version of the lib: do you build your app in debug or release mode?
-
@jsulm How to check the missing symbols are in the or not?
I build debug version of libraries and I try to lauch Qt in debug mod. What is the difference between debug version of libraries and release? Can I build library in debug mod and launch it in Qt in release mod?
Sorry for so many questions but I need to understand the basics of programming in Qt. -
@Please_Help_me_D said in Can't add HDF5 library in empty Qt-project:
How to check the missing symbols are in the or not?
Don't know how to do it on Windows, on Linux there is nm tool.
Take a look at https://stackoverflow.com/questions/305287/how-to-see-the-contents-of-windows-library-libOn Windows you should not mix debug and release binaries. But since you're building in debug mode it should be fine.
-
Seeing the numbers of .dll files in your bin folder, you shall have the same number of .lib files somewhere. I suspect that you are not linking enough of the hdf5 libraries.
-
@jsulm I followed the link you gave and output of dumpbin command:
dumpbin /EXPORTS hdf5_cpp_D.lib
is inside the link (let me know if it works): output_from_dumpbin
I don't know know yet how to read it.@SGaist I looked to the lib folder and the number of libraries doesn't match to the number of .dll in bin folder. I also tried to add all the libraries:
LIBS += "-LC:/apps/MSVC_apps_debug/HDF5/lib/lhdf5_cpp_D.lib" LIBS += "-LC:/apps/MSVC_apps_debug/HDF5/lib/lhdf5_D.lib" LIBS += "-LC:/apps/MSVC_apps_debug/HDF5/lib/hdf5_hl_cpp_D.lib" LIBS += "-LC:/apps/MSVC_apps_debug/HDF5/lib/hdf5_hl_D.lib" LIBS += "-LC:/apps/MSVC_apps_debug/HDF5/lib/hdf5_tools_D.lib" INCLUDEPATH += C:/apps/MSVC_apps_debug/HDF5/include DEPENDPATH += C:/apps/MSVC_apps_debug/HDF5/include
but the errors don't change
-
@Please_Help_me_D said in Can't add HDF5 library in empty Qt-project:
LIBS += "-LC:/apps/MSVC_apps_debug/HDF5/lib/lhdf5_D.lib"
This is not a correct syntax. Please try
LIBS += "C:/apps/MSVC_apps_debug/HDF5/lib/hdf5_D.lib"
and so on
-
@Konstantin-Tokarev I just tried:
LIBS += "C:/apps/MSVC_apps_debug/HDF5/lib/lhdf5_cpp_D.lib" LIBS += "C:/apps/MSVC_apps_debug/HDF5/lib/lhdf5_D.lib" LIBS += "C:/apps/MSVC_apps_debug/HDF5/lib/hdf5_hl_cpp_D.lib" LIBS += "C:/apps/MSVC_apps_debug/HDF5/lib/hdf5_hl_D.lib" LIBS += "C:/apps/MSVC_apps_debug/HDF5/lib/hdf5_tools_D.lib" INCLUDEPATH += C:/apps/MSVC_apps_debug/HDF5/include DEPENDPATH += C:/apps/MSVC_apps_debug/HDF5/include
I get an error:
error: LNK1104: can't open file "C:\apps\MSVC_apps_debug\HDF5\lib\lhdf5_cpp_D.lib"
Does it depend that libraries were built with GUI Cmake and the project I run with qmake? -
@Please_Help_me_D You have an error in your path: file name is
hdf5_cpp_D.lib
while you are usinglhdf5_cpp_D.lib
-
@Konstantin-Tokarev i'm sorry, my mistake. I changed it to the correct name and the errors now are:
main.obj: -1: error: LNK2001: unresolved external character "" public: static class H5 :: FileAccPropList const & const H5 :: FileAccPropList :: DEFAULT "(? DEFAULT @ FileAccPropList @ H5 @@ 2AEBV12 @ EB)"
main.obj: -1: error: LNK2001: unresolved external character "" public: static class H5 :: FileCreatPropList const & const H5 :: FileCreatPropList :: DEFAULT "(? DEFAULT @ FileCreatPropList @ H5 @@ 2AEBV12 @ EB)"
etc...
debug \ HDF5.exe: -1: error: LNK1120: unresolved external elements: 6 -
Make sure that all paths correspond to existing files.Find in which library
H5 :: FileAccPropList
is defined -
@Konstantin-Tokarev I did
dumpbin /EXPORTS each_of_my_labrary
and I only found that FileAccPropList belongs to hdf5_cpp_D.lib.
One thing seemed to me interesting... When I built HDF5 libraries there was an option to include C++ libraries and I included them. Now output from dumpbin C and C++ libraries are very different. Here are few lines of dumpbin C.lib:Microsoft (R) COFF/PE Dumper Version 14.16.27030.1 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file C:\apps\MSVC_apps_debug\HDF5\lib\hdf5_D.lib File Type: LIBRARY Exports ordinal name H5AC_BT H5AC_BT2_HDR H5AC_BT2_INT H5AC_BT2_LEAF H5AC_DRVRINFO H5AC_EARRAY_DBLK_PAGE H5AC_EARRAY_DBLOCK H5AC_EARRAY_HDR
And here are few lines of dumpbin C++.lib:
Microsoft (R) COFF/PE Dumper Version 14.16.27030.1 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file C:\apps\MSVC_apps_debug\HDF5\lib\hdf5_cpp_D.lib File Type: LIBRARY Exports ordinal name ??0AbstractDs@H5@@IEAA@XZ (protected: __cdecl H5::AbstractDs::AbstractDs(void)) ??0AbstractDs@H5@@QEAA@AEBV01@@Z (public: __cdecl H5::AbstractDs::AbstractDs(class H5::AbstractDs const &)) ??0ArrayType@H5@@QEAA@AEBV01@@Z (public: __cdecl H5::ArrayType::ArrayType(class H5::ArrayType const &)) ??0ArrayType@H5@@QEAA@AEBVDataType@1@HPEB_K@Z (public: __cdecl H5::ArrayType::ArrayType(class H5::DataType const &,int,unsigned __int64 const *)) ??0ArrayType@H5@@QEAA@AEBVH5Location@1@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z (public: __cdecl H5::ArrayType::ArrayType(class H5::H5Location const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)) ??0ArrayType@H5@@QEAA@AEBVH5Location@1@PEBD@Z (public: __cdecl H5::ArrayType::ArrayType(class H5::H5Location const &,char const *)) ??0ArrayType@H5@@QEAA@XZ (public: __cdecl H5::ArrayType::ArrayType(void)) ??0ArrayType@H5@@QEAA@_J@Z (public: __cdecl H5::ArrayType::ArrayType(__int64))
How do you think, maybe C++ libraries were installed incorretly?
-
@Konstantin-Tokarev @SGaist @jsulm as you suspected the problem was that used wrong libraries. Those libraries whose names begin with lib are static. And those who don't those are shared (information from HDFGroup web-site, see picture).
Previously I tried to include shared libraries and they don't work (don't know why). Now I use static libraries and they work.
So I use the followng lines (it works):LIBS += "C:/apps/MSVC_apps_debug/HDF5/lib/libhdf5_cpp_D.lib" LIBS += "C:/apps/MSVC_apps_debug/HDF5/lib/libhdf5_D.lib" LIBS += "C:/apps/MSVC_apps_debug/HDF5/lib/libhdf5_hl_cpp_D.lib" LIBS += "C:/apps/MSVC_apps_debug/HDF5/lib/libhdf5_hl_D.lib" LIBS += "C:/apps/MSVC_apps_debug/HDF5/lib/libhdf5_tools_D.lib" INCLUDEPATH += C:/apps/MSVC_apps_debug/HDF5/include DEPENDPATH += C:/apps/MSVC_apps_debug/HDF5/include
Can you give me advise why shared libraries don't work? How should I decide whether to use shared or static libraries?
-
So you tried to link to .dll files which are the shared libraries but not what you use to link to on Windows.
.lib files can be either the static version of the libraries or an "import file" used to tell the linker what symbols it will have from the library. The usual way to know which type it is is by looking at its size. Small sizes suggest that you have the import file while bigger sizes suggest static libraries.
-
@SGaist thank you for information about the weight of static and shared libraries. One of my shared library weighs 380 kb and the same static library weighs 33 Mb.
I opened them with help of 7zip and I saw that shared .lib-file include .dll files, and static .lib-file includes .obj files (see picture).
Is there a connection between libraries .lib and .exe files and .dll files that are in the bin folder? -
I was talking about the .lib files themselves.
.dll are in any shared libraries.