使用Intel oneAPI icpx编译GDAL的cpp文件出现未定义标识符报错如何解决
报错原因
- 核心原因是编译命令的头文件搜索路径参数语法错误:你使用的
-Imedia/sf_Share/xxx参数缺少根路径前缀/,编译器会将该路径识别为相对于当前工作目录的相对路径,只要你执行编译的工作目录不是系统根目录,就无法正确找到GDAL的port目录,导致cpl_error_internal.h头文件引入失败,其中定义的CPLErrorHandlerAccumulatorStruct结构体完全未被编译器识别,进而触发连锁的语法报错。 - 次要原因是Intel icpx编译器的头文件依赖检查比GCC更严格,不会通过其他头文件隐式引入
<vector>,如果头文件路径修正后仍有std::vector相关报错,就是缺少<vector>头文件显式引入导致的。
解决办法
- 首先修正编译命令的头文件路径参数,将
-Imedia/改为-I/media/,修正后的单文件编译命令如下:
icpx /media/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0/port/cpl_error.cpp -I/media/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0/port
- 若修正路径后仍报
no template named 'vector' in namespace 'std'错误,在cpl_error.cpp的开头include语句块中添加如下代码即可:
#include <vector>
- 如果你需要完整编译GDAL库,不建议手动单文件编译,直接使用GDAL官方的CMake构建流程指定Intel编译器即可,自动处理所有依赖:
# 进入GDAL源码根目录 cd /media/sf_Share/IMWEBsModel/imwebs_Linux/WetSpaInterface2/gdal/gdal-3.3.0 mkdir build && cd build cmake .. -DCMAKE_CXX_COMPILER=icpx -DCMAKE_C_COMPILER=icx make -j$(nproc) sudo make install
内容的提问来源于stack exchange,提问作者user1268890
相关产品推荐
相关产品推荐

