我的目标是将 gdal cpp 文件编译为编译水文模型的迷你阶段。为此,我在 Ubuntu 上安装了 Intel OneAPI 基础工具包。使用它的编译器 icpx,我尝试编译 gdal cpp 文件。但是,它会引发与找不到头文件和从这些头文件中读取所需类相关的错误。所有头文件都包含在 cpp 文件中,并且它们完全位于 cpp 文件的同一目录中。任何帮助将不胜感激。
icpx /media/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0/port/cpl_error.cpp -Imedia/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0/port '''
错误:
media/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0/port/cpl_error.cpp:1341:17: error: use of undeclared identifier 'CPLErrorHandlerAccumulatorStruct'; did you mean 'CPLErrorHandlerAccumulator'?
std::vector<CPLErrorHandlerAccumulatorStruct>* paoErrors =
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CPLErrorHandlerAccumulator
/media/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0/port/cpl_error.cpp:1338:18: note: 'CPLErrorHandlerAccumulator' declared here
void CPL_STDCALL CPLErrorHandlerAccumulator( CPLErr eErr, CPLErrorNum no,
^
/media/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0/port/cpl_error.cpp:1341:52: error: use of undeclared identifier 'paoErrors'
std::vector<CPLErrorHandlerAccumulatorStruct>* paoErrors =
^
/media/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0/port/cpl_error.cpp:1342:26: error: no template named 'vector' in namespace 'std'
static_cast<std::vector<CPLErrorHandlerAccumulatorStruct> *>(
~~~~~^
/media/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0/port/cpl_error.cpp:1342:33: error: use of undeclared identifier 'CPLErrorHandlerAccumulatorStruct'; did you mean 'CPLErrorHandlerAccumulator'?
static_cast<std::vector<CPLErrorHandlerAccumulatorStruct> *>(
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CPLErrorHandlerAccumulator
/media/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0/port/cpl_error.cpp:1338:18: note: 'CPLErrorHandlerAccumulator' declared here
void CPL_STDCALL CPLErrorHandlerAccumulator( CPLErr eErr, CPLErrorNum no,
^
/media/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0/port/cpl_error.cpp:1344:5: error: use of undeclared identifier 'paoErrors'
paoErrors->push_back(CPLErrorHandlerAccumulatorStruct(eErr, no, msg));
^
/media/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0/port/cpl_error.cpp:1344:26: error: use of undeclared identifier 'CPLErrorHandlerAccumulatorStruct'; did you mean 'CPLErrorHandlerAccumulator'?
paoErrors->push_back(CPLErrorHandlerAccumulatorStruct(eErr, no, msg));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CPLErrorHandlerAccumulator
/media/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0/port/cpl_error.cpp:1338:18: note: 'CPLErrorHandlerAccumulator' declared here
void CPL_STDCALL CPLErrorHandlerAccumulator( CPLErr eErr, CPLErrorNum no,
^
/media/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0/port/cpl_error.cpp:1348:6: error: variable has incomplete type 'void'
void CPLInstallErrorHandlerAccumulator(std::vector<CPLErrorHandlerAccumulatorStruct>& aoErrors)
^
/media/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0/port/cpl_error.cpp:1348:45: error: no member named 'vector' in namespace 'std'
void CPLInstallErrorHandlerAccumulator(std::vector<CPLErrorHandlerAccumulatorStruct>& aoErrors)
~~~~~^
/media/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0/port/cpl_error.cpp:1348:52: error: use of undeclared identifier 'CPLErrorHandlerAccumulatorStruct'; did you mean 'CPLErrorHandlerAccumulator'?
void CPLInstallErrorHandlerAccumulator(std::vector<CPLErrorHandlerAccumulatorStruct>& aoErrors)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CPLErrorHandlerAccumulator
/media/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0/port/cpl_error.cpp:1338:18: note: 'CPLErrorHandlerAccumulator' declared here
void CPL_STDCALL CPLErrorHandlerAccumulator( CPLErr eErr, CPLErrorNum no,
^
/media/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0/port/cpl_error.cpp:1348:87: error: use of undeclared identifier 'aoErrors'
void CPLInstallErrorHandlerAccumulator(std::vector<CPLErrorHandlerAccumulatorStruct>& aoErrors)
^
/media/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0/port/cpl_error.cpp:1348:96: error: expected ';' after top level declarator
void CPLInstallErrorHandlerAccumulator(std::vector<CPLErrorHandlerAccumulatorStruct>& aoErrors)
^
;
12 errors generated.
'''
更新:更多说明:主 cpp 程序具有以下类:
static
void CPL_STDCALL CPLErrorHandlerAccumulator( CPLErr eErr, CPLErrorNum no,
const char* msg )
{
std::vector<CPLErrorHandlerAccumulatorStruct>* paoErrors =
static_cast<std::vector<CPLErrorHandlerAccumulatorStruct> *>(
CPLGetErrorHandlerUserData());
paoErrors->push_back(CPLErrorHandlerAccumulatorStruct(eErr, no, msg));
}
void CPLInstallErrorHandlerAccumulator(std::vector<CPLErrorHandlerAccumulatorStruct>& aoErrors)
{
CPLPushErrorHandlerEx( CPLErrorHandlerAccumulator, &aoErrors );
}
void CPLUninstallErrorHandlerAccumulator()
{
CPLPopErrorHandler();
}
在这个类中,它尝试调用 CPLErrorHandlerAccumulatorStruct,它是头文件中的另一个类,名为 cpl_error_internal ,它包含在主 cpp 文件的开头 -->
#include "cpl_error_internal.h"
我猜的问题是主程序找不到头文件!虽然 1)它包含 2)目录没有问题。