Связывание библиотеки NetCDF в Windows с помощью cmake

Я пытаюсь включить/связать библиотеку NetCDF C (https://www.unidata.ucar.edu/software/netcdf/docs/index.html) в мой проект C++/CUDA с помощью cmake. Хотя, похоже, у меня проблемы.

Я работаю в Windows 10 и установил библиотеки NetCDF C для Windows версии 4.7. Включение библиотек NetCDF вроде бы проходит без заминок, проблема на этапе линковки.

Мой код, использующий библиотеку NetCDF:

netcdf_writer.cpp

#ifndef __CUDACC__
//only actually include the NetCDF libraries if we aren't in CUDA
#include <netcdf.h>

#endif

void write_full_netcdf_file(string filename, Configuration cfg) {
    int ncid, x_dimid;

    int retval;

    if ((retval = nc_create(filename.c_str(), NC_CLOBBER, &ncid))) {
        ERR(retval);
    }
    /* Define the dimensions. NetCDF will hand back an ID for each. */
    if ((retval = nc_def_dim(ncid, "x", cfg.nx, &x_dimid)))
        ERR(retval);


}

Обратите внимание, что этот код соответствующим образом разделен на файлы заголовков/cpp, я просто объединил их здесь для простоты.

Усеченная версия моего файла CMakeLists.txt приведена ниже. Обратите внимание, что я использую FindNetCDF.cmake от VTK: https://github.com/Kitware/VTK/blob/master/CMake/FindNetCDF.cmake, чтобы выполнить поиск.

cmake_minimum_required(VERSION 3.8 FATAL_ERROR)
project(cmake_and_cuda LANGUAGES CXX CUDA)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")

include(CTest)

#add in all CUDA and C++ files along with their associated headers. 
file(GLOB_RECURSE sources  src/*.cu src/*.cpp)
file(GLOB_RECURSE headers "src/*.h" "src/*.hpp" "src/*.cuh")


find_package(NetCDF 4.7 REQUIRED)
INCLUDE_DIRECTORIES(${NetCDF_INCLUDE_DIRS})
set(LIBS ${LIBS} ${NetCDF_LIBRARIES})


set (Foo_INCLUDE_DIRS "")
foreach (_headerFile ${headers})
    get_filename_component(_dir ${_headerFile} PATH)
    list (APPEND Foo_INCLUDE_DIRS ${_dir})
endforeach()
list(REMOVE_DUPLICATES Foo_INCLUDE_DIRS)

 set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -g")
# We need to explicitly state that we need all CUDA files in the 
# particle library to be built with -dc as the member functions 
# could be called by other libraries and executables

add_executable(foo ${sources})


set_property(TARGET foo
             PROPERTY CUDA_SEPARABLE_COMPILATION ON)
target_include_directories(foo PRIVATE ${Foo_INCLUDE_DIRS}) 
target_link_libraries(foo PRIVATE ${LIBS} )
target_link_libraries(foo PUBLIC NetCDF::NetCDF)

Когда я запускаю cmake, я получаю следующее:

CMake Error at CMakeLists.txt:45 (add_executable):
  Target "foo" links to target "hdf5::hdf5-shared" but the target was not
  found.  Perhaps a find_package() call is missing for an IMPORTED target, or
  an ALIAS target is missing?


CMake Error at CMakeLists.txt:45 (add_executable):
  Target "foo" links to target "hdf5::hdf5_hl-shared" but the target was not
  found.  Perhaps a find_package() call is missing for an IMPORTED target, or
  an ALIAS target is missing?
...

Что я пробовал:

  • Я пытался явно включить/связать библиотеку HDF5 (хотя NetCDF уже должен это предоставить). Это приводит к той же ошибке.
  • Я попытался явно связать две библиотеки HDF5: target_link_libraries(mac PUBLIC hdf5::hdf5-shared hdf5::hdf5_hl-shared). Опять же, это приводит к той же ошибке.

person Laxsnor    schedule 15.04.2020    source источник
comment
Что включает в себя ${NetCDF_LIBRARIES}? Вы можете распечатать это с помощью message(${NetCDF_LIBRARIES}).   -  person squareskittles    schedule 15.04.2020
comment
${NetCDF_LIBRARIES} это netcdf, видимо. Возможно, проблема в моем FindNetCDF.cmake, хотя похоже, что файл из vtk довольно хорошо используется.   -  person Laxsnor    schedule 15.04.2020
comment
Похоже, что суть проблемы заключается в netCDFConfig.cmake скрипт, который входит в FindNetCDF.cmake скрипт с find_package(netCDF CONFIG QUIET) строкой. Насколько я понимаю, netCDF внутренне связан с hdf5, и эта связь становится частью скрипта netCDFConfig.cmake. Однако в скрипте не хватает строки find_dependency(HDF5). Добавьте эту строку в скрипт, например. перед include("${CMAKE_CURRENT_LIST_DIR}/netCDFTargets.cmake") строкой.   -  person Tsyvarev    schedule 15.04.2020
comment
Чтобы найти netCDFConfig.cmake скрипт для редактирования, откройте CMakeCache.txt файл в каталоге сборки и найдите в нем переменную netCDF_DIR. Значением этой переменной является каталог с netCDFConfig.cmake скриптом.   -  person Tsyvarev    schedule 15.04.2020
comment
В качестве альтернативы вы можете попробовать добавить find_package(HDF5 REQUIRED) в ваш CMakeLists.txt и посмотреть, что произойдет.   -  person Tsyvarev    schedule 15.04.2020
comment
Я думаю, что мы быстро приближаемся к ответу; спасибо @Tsyvarev. Когда я включаю find_package(HDF5 REQUIRED), я получаю новую ошибку, а именно, что теперь не может найти Threads::Threads. Я сейчас тоже копаюсь в сценарии netCDFConfig.cmake.   -  person Laxsnor    schedule 15.04.2020
comment
Это проблема, но я не думаю, что это проблема: он вытаскивал NetCDF 4.4.1.1 из моей библиотеки anaconda, я переопределю это и посмотрю, работает ли это.   -  person Laxsnor    schedule 15.04.2020
comment
@Tsyvarev добавление find_package(HDF5 REQUIRED) и find_package(Threads REQUIRED) сработало; если вы напишите это как ответ, я был бы рад принять. Я думаю, это действительно показывает проблемы с включением библиотек Anaconda в ваш путь.   -  person Laxsnor    schedule 15.04.2020