0

I'm trying to compile a project containing C and C++ files. I'm using icc compiler (Intel OneAPI toolkit) on Ubuntu. I'm also using Makefiles to compile and link programs/libraries. however, I am receiving three following errors.

/home/Documents/WetSpaInterface2/WetSpaHDF5Generation/HDF5WritingUtil.cpp:219: undefined reference to `H5::Exception::getDetailMsg[abi:cxx11]() const' ld: /home/Documents/WetSpaInterface2/WetSpaHDF5Generation/HDF5WritingUtil.cpp:189: undefined reference to `H5::Exception::getDetailMsg[abi:cxx11]() const'

ld: build/debug/libWetSpaBMP.a(BMPArealNonStructural.o): in function `MainBMP::BMPArealNonStructural::BMPArealNonStructural(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)':

/home/Documents/WetSpaInterface2/WetSpaBMP/BMPArealNonStructural.cpp:1136: undefined reference to `MainBMP::NonStructural::ManagementOperationList::~ManagementOperationList()'

My make file:

CFLAGS_RELEASE_ICC="-qopenmp -D_GLIBCXX_USE_CXX11_ABI=0 -fPIC -O2 -std=c++17 -w -lstdc++ -fp-model precise"
CFLAGS_RELEASE_GCC="-fopenmp -fPIC -O2 -Wfatal-errors -lstdc++"
CFLAGS_RELEASE = $(CFLAGS_RELEASE_ICC)
CXXFLAGS_RELEASE = $(CFLAGS_RELEASE_GCC)
CFLAGS_DEBUG="-g "$(CFLAGS_RELEASE)
CC=@icc
CXX= @icc
MKDIR=build/makefile/
MAKE=@make
MAKE_J=-j32
OUTDIR_DEBUG=build/debug
OUTDIR_RELEASE=build/release


HDF5PATH_CSAHS=hdf5/

#!!Make sure to use the right HDF5 path in each system
HDFINCLUDE=-I$(HDF5PATH_CSAHS)include
HDFLIB=-Lhdf5/lib -lhdf5_cpp -lhdf5

mk_debug:
    $(MAKE) -f $(MKDIR)lib.mk CC=$(CC) MAKE_J=$(MAKE_J) CFLAGS=$(CFLAGS_DEBUG) OUTDIR=$(OUTDIR_DEBUG) HDFINCLUDE=$(HDFINCLUDE) HDFLIB="$(HDFLIB)"
    $(MAKE) -f $(MKDIR)TestModule.mk CC=$(CC) MAKE_J=$(MAKE_J) CFLAGS=$(CFLAGS_DEBUG) OUTDIR=$(OUTDIR_DEBUG) HDFINCLUDE=$(HDFINCLUDE) HDFLIB="$(HDFLIB)"

I am not using CMake so, -D_GLIBCXX_USE_CXX11_ABI=0 doesn't work for me. Any hint or solution would be highly appreciated.

Update: The above makefile is a make file that calls other makefiles (such as the following one) and compiles them.

$(OUTDIR)/libimWEBsEngine.a:  build/imWEBsEngine/ModuleParameterPrecipitationStatistic.o build/imWEBsEngine/Settings.o build/imWEBsEngine/ModuleOutputSingle.o build/imWEBsEngine/ModuleInputStationProperty.o build/imWEBsEngine/ModuleMetadata.o build/imWEBsEngine/ModuleParameter.o build/imWEBsEngine/ResultOutputMassBalance.o build/imWEBsEngine/ResultOutputStationClimate.o build/imWEBsEngine/ModuleInputStationClimate.o build/imWEBsEngine/WetspaModule.o build/imWEBsEngine/ModuleInputOutput.o build/imWEBsEngine/ModuleInput.o build/imWEBsEngine/ModuleParameterWeight.o build/imWEBsEngine/WetSpaInterface2.o build/imWEBsEngine/ModuleParameterRaster.o build/imWEBsEngine/SettingsCalibration.o build/imWEBsEngine/ModuleParameterSubbasinSelected.o build/imWEBsEngine/ModuleParameterLapseRate.o build/imWEBsEngine/ResultOutputRaster.o build/imWEBsEngine/SettingsConfig.o build/imWEBsEngine/SettingsOutput.o build/imWEBsEngine/ResultOutputTimeSeries.o build/imWEBsEngine/ModuleOutput2D.o build/imWEBsEngine/PrintInfo.o build/imWEBsEngine/ResultOutput.o build/imWEBsEngine/ModuleOutput1D.o build/imWEBsEngine/EngineBase.o build/imWEBsEngine/main.o build/imWEBsEngine/ModuleOutput.o build/imWEBsEngine/ModuleParameterReachParameter.o build/imWEBsEngine/SettingsInput.o build/imWEBsEngine/WetSpaMain.o build/imWEBsEngine/ModuleParameterSingle.o
    ar rcs $(OUTDIR)/libimWEBsEngine.a build/imWEBsEngine/ModuleParameterPrecipitationStatistic.o build/imWEBsEngine/Settings.o build/imWEBsEngine/ModuleOutputSingle.o build/imWEBsEngine/ModuleInputStationProperty.o build/imWEBsEngine/ModuleMetadata.o build/imWEBsEngine/ModuleParameter.o build/imWEBsEngine/ResultOutputMassBalance.o build/imWEBsEngine/ResultOutputStationClimate.o build/imWEBsEngine/ModuleInputStationClimate.o build/imWEBsEngine/WetspaModule.o build/imWEBsEngine/ModuleInputOutput.o build/imWEBsEngine/ModuleInput.o build/imWEBsEngine/ModuleParameterWeight.o build/imWEBsEngine/WetSpaInterface2.o build/imWEBsEngine/ModuleParameterRaster.o build/imWEBsEngine/SettingsCalibration.o build/imWEBsEngine/ModuleParameterSubbasinSelected.o build/imWEBsEngine/ModuleParameterLapseRate.o build/imWEBsEngine/ResultOutputRaster.o build/imWEBsEngine/SettingsConfig.o build/imWEBsEngine/SettingsOutput.o build/imWEBsEngine/ResultOutputTimeSeries.o build/imWEBsEngine/ModuleOutput2D.o build/imWEBsEngine/PrintInfo.o build/imWEBsEngine/ResultOutput.o build/imWEBsEngine/ModuleOutput1D.o build/imWEBsEngine/EngineBase.o build/imWEBsEngine/main.o build/imWEBsEngine/ModuleOutput.o build/imWEBsEngine/ModuleParameterReachParameter.o build/imWEBsEngine/SettingsInput.o build/imWEBsEngine/WetSpaMain.o build/imWEBsEngine/ModuleParameterSingle.o

build/imWEBsEngine/ModuleParameterPrecipitationStatistic.o: WetSpaInterface2/WetSpaInterface2/ModuleParameterPrecipitationStatistic.cpp
    $(CC) $(CFLAGS) -o build/imWEBsEngine/ModuleParameterPrecipitationStatistic.o -c WetSpaInterface2/WetSpaInterface2/ModuleParameterPrecipitationStatistic.cpp  -IWetSpaInterface2/WetSpaHDF5Generation -IWetSpaInterface2/boost/boost_1_48_0 $(HDFINCLUDE) -IWetSpaInterface2/WetSpaParameterData -IWetSpaInterface2/WetSpaModule -IWetSpaInterface2/WetSpaUtil -IWetSpaInterface2/WetSpaData -IWetSpaInterface2/WetSpaBMP
  • This is the wrong makefile (there is nothing in this file that tells us how the compiler is invoked). This invokes another makefile that probably hold the details. – Martin York Jul 07 '21 at 16:18
  • This is the main makeffile that invokes other makefiles (hierarchical order). I use make -f Name_makefile mk_debug to run this makefile. – user1268890 Jul 07 '21 at 16:48
  • Why would using (or not) CMake affect whether that glibc macro is effective? – Useless Jul 07 '21 at 16:55
  • I tried to use it in my Makefile, but it ended up at errors "make: invalid option -- 'D'". – user1268890 Jul 07 '21 at 16:58

1 Answers1

0

HDF5WritingUtil.cpp:219: undefined reference to H5::Exception::getDetailMsg[abi:cxx11]() const

There is a high chance that you compiled HDF5WritingUtil.cpp with -std=c++11 (or -std=c++17) flag, but are trying to link with the HDF5 library which was compiled without that flag.

Running nm -A *.a | grep 'H5.*Exception.*getDetailMsg' against libWetSpaBMP.a and libhdf5.a (or whatever that library is called) should allow you to confirm that the unresolved (U) and defined (T) symbols are different.

Employed Russian
  • 199,314
  • 34
  • 295
  • 362