0

我正在尝试编译一个包含 C 和 C++ 文件的项目。我在 Ubuntu 上使用 icc 编译器(英特尔 OneAPI 工具包)。我还使用 Makefiles 来编译和链接程序/库。但是,我收到以下三个错误。

/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()'

我的制作文件:

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

我没有使用 CMake,所以 -D_GLIBCXX_USE_CXX11_ABI=0 对我不起作用。任何提示或解决方案将不胜感激。

更新:上面的makefile是一个make文件,它调用其他makefile(比如下面的)并编译它们。

$(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
4

1 回答 1

0

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

您很有可能HDF5WritingUtil.cpp使用-std=c++11(or -std=c++17) 标志进行编译,但尝试链接在没有该标志的情况下HDF5编译的库。

运行and (或任何调用该库nm -A *.a | grep 'H5.*Exception.*getDetailMsg'的库)应该允许您确认未解析的 ( ) 和已定义的 ( ) 符号是不同的。libWetSpaBMP.alibhdf5.aUT

于 2021-07-07T20:32:57.917 回答