GDAL 未链接
GDAL Not Linking
我正试图在 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 但无济于事。有什么想法吗?
显然你正试图 link 你用 VC++ 编译的库和对象
您正在使用 GCC (MinGW) 编译的文件。那是行不通的。
GCC 和 VC++ 有不同且不兼容的 ABIs,
尤其是不同的 name mangling 协议。
因此,您的目标代码中 MinGW 发出的损坏的函数名称将
与您的 VC++ 编译库导出的任何内容都不匹配。你将需要
使用 MinGW 构建 GDAL 库。
谢谢@MikeKinghan!几天来我一直在拔头发!你的答案马上就被点击了。对于那些不想对这些库感到头疼的人,只需使用 MSYS2 (msys2.org)。然后在 msys2 命令提示符中使用 pacman
,获取 MingW (pacman -S mingw-w64-x86_64-gcc
) 和 GDAL (pacman -S mingw-w64-x86_64-gdal
).
我正试图在 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 但无济于事。有什么想法吗?
显然你正试图 link 你用 VC++ 编译的库和对象 您正在使用 GCC (MinGW) 编译的文件。那是行不通的。 GCC 和 VC++ 有不同且不兼容的 ABIs, 尤其是不同的 name mangling 协议。 因此,您的目标代码中 MinGW 发出的损坏的函数名称将 与您的 VC++ 编译库导出的任何内容都不匹配。你将需要 使用 MinGW 构建 GDAL 库。
谢谢@MikeKinghan!几天来我一直在拔头发!你的答案马上就被点击了。对于那些不想对这些库感到头疼的人,只需使用 MSYS2 (msys2.org)。然后在 msys2 命令提示符中使用 pacman
,获取 MingW (pacman -S mingw-w64-x86_64-gcc
) 和 GDAL (pacman -S mingw-w64-x86_64-gdal
).