首页 > 解决方案 > 尝试使用 GDAL 的 GDALDataset::GetLayers() 编译时未定义的引用

问题描述

我正在尝试编译一些涉及 GDAL 的代码,但不断出现错误。它看起来像是GetLayers在 gdal_priv.h 中定义的,但 Clion 报告该文件不属于任何项目目标,我对此表示怀疑。据此,它应该工作。其他poDS工作方法,例如GetLayerByName. 关于我可以在哪里看的任何想法?我想知道我的 cmakelists.txt 是否有误。

这是一些示例代码。我知道这poDS->GetFeatures();是错误的,但我只是在测试。

主文件

#include "DisplayShapefile.h"
#include <iostream>

GDALDataset * Shapefile::read(const char *path) {
    // Read shapefile from filesystem
    GDALAllRegister();
    GDALDataset *poDS;

    poDS = (GDALDataset*) GDALOpenEx(path, GDAL_OF_VECTOR, NULL, NULL,  NULL);

    if( poDS == NULL ) {
        printf( "Open failed.\n" );
        exit ( 1 );
    }
    poDS->GetFeatures();
    return poDS;
}

int Shapefile::get_layer_count(GDALDataset *dataset) {
    // Get layer count contained by shapefile
    return GDALDatasetGetLayerCount(dataset);
}

std::vector<std::string> Shapefile::layer_names(GDALDataset *dataset) {
    std::vector<std::string> names;
    for( auto&& poLayer: dataset->GetLayers() ) {
        std::string name = poLayer->GetName();
        names.push_back(name);
        std::cout << "Layer " << name << std::endl;
    }
    return names;
}

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

制作清单

cmake_minimum_required(VERSION 3.17)
project(gdalTest)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_PREFIX_PATH "C:\\msys64\\mingw64")

find_package(GDAL REQUIRED)
include_directories ( include ${GDAL_INCLUDE_DIRS})

set(SOURCE_FILES C:/OSGeo4W64/include/gdal_priv.h)

add_executable(gdalTest main.cpp DisplayShapefile.h ${SOURCE_FILES})

target_link_libraries(gdalTest ${GDAL_LIBRARIES})

我得到的错误是:

CMakeFiles\gdalTest.dir/objects.a(main.cpp.obj): In function `Shapefile::read(char const*)':
C:/Users/rwardrup/CLionProjects/gdalTest/main.cpp:19: undefined reference to `GDALDataset::GetFeatures()'
CMakeFiles\gdalTest.dir/objects.a(main.cpp.obj): In function `Shapefile::layer_names[abi:cxx11](GDALDataset*)':
C:/Users/rwardrup/CLionProjects/gdalTest/main.cpp:30: undefined reference to `GDALDataset::GetLayers()'
C:/Users/rwardrup/CLionProjects/gdalTest/main.cpp:30: undefined reference to `GDALDataset::Layers::begin() const'
C:/Users/rwardrup/CLionProjects/gdalTest/main.cpp:30: undefined reference to `GDALDataset::Layers::end() const'
C:/Users/rwardrup/CLionProjects/gdalTest/main.cpp:30: undefined reference to `GDALDataset::Layers::Iterator::operator!=(GDALDataset::Layers::Iterator const&) const'
C:/Users/rwardrup/CLionProjects/gdalTest/main.cpp:30: undefined reference to `GDALDataset::Layers::Iterator::operator*() const'
C:/Users/rwardrup/CLionProjects/gdalTest/main.cpp:30: undefined reference to `GDALDataset::Layers::Iterator::operator++()'
C:/Users/rwardrup/CLionProjects/gdalTest/main.cpp:30: undefined reference to `GDALDataset::Layers::Iterator::~Iterator()'
C:/Users/rwardrup/CLionProjects/gdalTest/main.cpp:30: undefined reference to `GDALDataset::Layers::Iterator::~Iterator()'
C:/Users/rwardrup/CLionProjects/gdalTest/main.cpp:30: undefined reference to `GDALDataset::Layers::Iterator::~Iterator()'
C:/Users/rwardrup/CLionProjects/gdalTest/main.cpp:30: undefined reference to `GDALDataset::Layers::Iterator::~Iterator()'

标签: c++gdalundefined-reference

解决方案


推荐阅读