ld: библиотека не найдена для -lnetcdf

#cmake #gfortran #netcdf

#cmake #gfortran #netcdf

Вопрос:

Я новичок в CMake. Я не могу устранить текущую ошибку. Может ли кто-нибудь мне помочь?

————ОШИБКА—————

 ld: library not found for -lnetcdf
collect2: error: ld returned 1 exit status
make[3]: *** [NUP] Error 1
make[2]: *** [CMakeFiles/NUP.dir/all] Error 2
make[1]: *** [CMakeFiles/NUP.dir/rule] Error 2
make: *** [NUP] Error 2
  

——————- Файл CMake——————

 cmake_minimum_required(VERSION 3.10.0)
project(NUP Fortran)
enable_language(Fortran)

set(INCLUDE_FILE /usr/local/Cellar/netcdf/4.7.4/include)
set(lib_FILE /usr/local/Cellar/netcdf/4.7.4/lib)
find_package(netcdf  REQUIRED)
if(netcdf_FOUND)
include_directories(${INCLUDE_FILE})

set(
        SOURCE_FILES
        ${PROJECT_BINARY_DIR} unpack.f90
)

add_executable(NUP ${SOURCE_FILES} )
target_link_libraries(NUP netcdf)
endif()
  

—————распаковать.f90——————-

 PROGRAM unpack_array

  IMPLICIT NONE
  INCLUDE 'netcdf.inc'

  INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(12,307)
......
  

Я использую MACOS Catalina. Apple clang версии 11.0.3 (clang-1103.0.32.59)
Цель: x86_64-apple-darwin19.4.0

Ответ №1:

Если вы используете find_package() для поиска NetCDF на своем компьютере, вам не нужно вручную указывать пути, как у вас есть. Позвольте find_package сделать это за вас.

Примечание: CMake не поставляется с модулем поиска для NetCDF, поэтому вам придется загрузить его (как этот) из Интернета. Затем вам нужно указать CMake, где найти этот FindNetCDF.cmake файл в вашей системе с помощью CMAKE_MODULE_PATH . Наконец, вы можете использовать NetCDF::NetCDF импортированный целевой файл для привязки NetCDF к целям вашего проекта.

 cmake_minimum_required(VERSION 3.10.0)
project(NUP Fortran)
# Don't need this, you already enabled Fortran above in the 'project' call.
enable_language(Fortran)

set(INCLUDE_FILE /usr/local/Cellar/netcdf/4.7.4/include)
set(lib_FILE /usr/local/Cellar/netcdf/4.7.4/lib)

# Add the location of the 'FindNetCDF.cmake' file to your module path.
list(APPEND CMAKE_MODULE_PATH "/path/to/downloaded/find/module")
# Then, call find package for NetCDF. 
find_package(NetCDF REQUIRED)

if(${NetCDF_FOUND})
    # Don't need this if you use the imported target below.
    include_directories(${INCLUDE_FILE})

    # Don't provide directories with source file list.
    set(SOURCE_FILES
        ${PROJECT_BINARY_DIR} 
        unpack.f90
    )

    add_executable(NUP ${SOURCE_FILES})

    # Use the imported target to link netcdf instead.
    target_link_libraries(NUP PRIVATE NetCDF::NetCDF)
endif()
  

Как указано, существуют другие подходы к добавлению NetCDF в ваш проект CMake. Если вы используете другой модуль поиска, синтаксис предоставленных переменных NetCDF CMake и импортированных целевых объектов может немного отличаться. Вам придется изучить сам файл модуля поиска.

Кроме того, вы можете вместо этого использовать файл конфигурации пакета CMake (например netCDFConfig.cmake ), загруженный из Интернета, чтобы добавить NetCDF в свой проект. В этом случае вы все равно будете использовать find_package() , но вы бы указали местоположение файла конфигурации с помощью CMAKE_PREFIX_PATH , а не CMAKE_MODULE_PATH .

Вы можете найти подробные описания для каждого из этих подходов в документации CMake find_package() . Я настоятельно рекомендую вам потратить некоторое время на ее прочтение.

Комментарии:

1. Поскольку код в вопросе не имеет CMAKE_MODULE_PATH настроек, более вероятно, что запрашивающий использует файл «Config» для поиска пакета, а не файл «Find». Этот файл конфигурации объявляется netCDF::netcdf ИМПОРТИРОВАННЫМ целевым объектом.

2. Я признателен за вашу помощь! Загружает вас обоих. Я изменил свой код только по вашему совету. Но я получаю другую ОШИБКУ, которую я не могу решить: неопределенные символы для архитектуры x86_64: » nf_close «, ссылка из: MAIN_ в unpack.f90.o

3. @Tsyvarev Спасибо, теперь я вижу, что CMake не предоставляет готовый модуль поиска.

4. @mengjiewarmuth Я просто нашел время обновить свой ответ. Я предоставил более подробную информацию о добавлении NetCDF в ваш проект. Надеюсь, это поможет!