GDAL未关联

时间:2017-10-20 04:40:16

标签: c++ linker gdal

我正在尝试让我的程序在Windows上运行。它取决于GDAL,一个用于加载GIS数据的库。它在Linux和macOS上编译和链接都很好。我正在使用CMK和MinGW,我正在尝试链接这样的错误:

undefined reference to `GDALRasterBand::RasterIO(GDALRWFlag, int, int, int, int, void*, int, int, GDALDataType, long, long, GDALRasterIOExtraArg*)'
CMakeFiles\Routes.dir/objects.a(elevation.cpp.obj): In function `ZN13ElevationData9calcStatsEv':
C:/Users/Logan/Documents/Routes/src/elevation/elevation.cpp:138: undefined reference to `GDALDataset::GetRasterXSize()'
C:/Users/Logan/Documents/Routes/src/elevation/elevation.cpp:139: undefined reference to `GDALDataset::GetRasterYSize()'
CMakeFiles\Routes.dir/objects.a(elevation.cpp.obj): In function `ZN13ElevationData17createOpenCLImageEv':
C:/Users/Logan/Documents/Routes/src/elevation/elevation.cpp:206: undefined reference to `GDALRasterBand::RasterIO(GDALRWFlag, int, int, int, int, void*, int, int, GDALDataType, long, long, GDALRasterIOExtraArg*)'

我使用VS2017编译了GDAL,并且我已经验证它已安装在我在CMake文件中指定的位置。以下是CMakeLists.txt的相关部分:

IF (WIN32)

  message(STATUS "Compiling for Windows")
  set(GDAL_LIBRARY "C:/warmerda/bld/lib/gdal_i.lib")
  set(GDAL_INCLUDE_DIR "C:/warmerda/bld/include/")

  find_package(OpenCL REQUIRED)
  include_directories(${OpenCL_INCLUDE_DIRS})

ELSE()

...

message(STATUS ${GDAL_LIBRARY})
target_link_libraries(Routes ${GDAL_LIBRARY} ${OpenCL_LIBRARIES})

我几乎从不在Windows上进行开发,所以我有点陷入困境。我尝试连接到dll也无济于事。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

显然,您正在尝试将使用VC ++编译的库与对象链接起来 您正在使用GCC(MinGW)编译的文件。这不起作用。 GCC和VC ++有不同且不兼容的ABIs, 特别是不同的name mangling协议。 因此,MinGW在您的目标代码中发出的错位函数名称将会出现 不匹配VC ++编译库导出的任何内容。你需要 使用MinGW构建GDAL库。

答案 1 :(得分:0)

感谢@MikeKinghan!我已经把头发拉了几天了!您的答案立即单击。对于那些不希望使用这些库的人,只需使用MSYS2(msys2.org)。然后在msys2命令提示符下使用pacman,获得MingW(pacman -S mingw-w64-x86_64-gcc)和GDAL(pacman -S mingw-w64-x86_64-gdal)。