2017-10-20 8 views
0

J'essaie de faire fonctionner mon programme sous Windows. Cela dépend de GDAL, une bibliothèque pour charger les données SIG. Il compile et relie bien sur Linux et macOS. J'utilise CMake avec MinGW et je suis en cours d'exécution en reliant des erreurs comme ceci:GDAL non lié

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*)' 

Je compilé GDAL avec VS2017 et je l'ai vérifié qu'il est installé où je suis dans mon dossier spécifiant CMake. Voici les parties pertinentes du 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}) 

Je ne presque jamais le développement sur Windows, donc je suis un peu coincé. J'ai essayé de lier contre la DLL aussi sans succès. Des idées?

Répondre

2

Apparemment, vous essayez de lier une bibliothèque que vous avez compilée avec VC++ avec l'objet fichiers que vous compilez avec GCC (MinGW). Ça ne marche pas. GCC et VC++ ont des protocoles ABIs, différents et incompatibles et en particulier des protocoles name mangling différents. Par conséquent, les noms de fonctions mutilés émis par MinGW dans votre code objet ne correspondront à aucun exporté par votre bibliothèque compilée VC++. Vous aurez besoin de construire la bibliothèque GDAL avec MinGW.

+0

Merci, j'ai compris cela après un petit moment, mais j'ai oublié la question que j'ai postée. – BlueSpud