我正在尝试让我的程序在 Windows 上运行。它依赖于GDAL,一个用于加载GIS数据的库。它在 Linux 和 macOS 上都能很好地编译和链接。我将 CMake 与 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,但没有成功。有什么想法吗?
最佳答案
显然您正在尝试将使用 VC++ 编译的库与对象链接起来 您使用 GCC (MinGW) 编译的文件。那是行不通的。 GCC 和 VC++ 有不同且不兼容 ABIs , 特别是不同的name mangling协议(protocol)。 因此,MinGW 在您的目标代码中发出的损坏的函数名称将 与您的 VC++ 编译库导出的任何内容都不匹配。您将需要 使用 MinGW 构建 GDAL 库。
关于c++ - GDAL 未链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46842468/