2017-01-10 6 views
1

Привет всем и благодаря вашей помощи,Написать CMake Найти NetCDF для библиотеки C и Fortran

Я новичок в CMake, и я пытаюсь написать библиотеку найти для библиотеки C и Fortran NetCDF. Проблема заключается в возможном разном местоположении и версии fortran и C netcdf.

Для Fortran библиотеки я искать netcdf.mod (включают в себя модуль) и libnetcdff.so (динамическую библиотеку) вместо того, чтобы для библиотеки C Я ищу netcdf.h и libnetcdf.so.

В Интернете я нашел волшебный код, найти правильно NetCDF C библиотеки:

find_path (NETCDF_INCLUDES_C netcdf.h HINTS NETCDF_DIR NETCDF_DIR) 
message(" inc = ${NETCDF_INCLUDES_C} ") 
find_library (NETCDF_LIBRARIES_C NAMES netcdf) 
message(" lib = ${NETCDF_LIBRARIES_C} ") 

и два пути правильно. Я пытаюсь ответить код Fortran:

find_path (NETCDFF_INCLUDES_F90 netcdff.mod HINTS NETCDFF_DIR NETCDFF_DIR) 
message(" inc ff = ${NETCDFF_INCLUDES_F90} ") 
find_library (NETCDFF_LIBRARIES_F90 NAMES netcdff HINTS NETCDFF_DIR) 
message(" lib ff= ${NETCDFF_LIBRARIES_F90} ") 
mark_as_advanced(NETCDF_LIBRARIES_F90) 

но оба пути F90 пуст, вероятно, потому, что я не понимаю, как CMake найти библиотеку C. Через МОДУЛЬ ОКРУЖАЮЩЕЙ СРЕДЫ я загрузить обе библиотеки и загрузка модуля, окр вар:

$NETCDFF_HOME $NETCDFF_INC $NETCDFF_INCLUDE $NETCDFF_LIB 
    $NETCDF_HOME $NETCDF_INC $NETCDF_INCLUDE $NETCDF_LIB 

Я полагаю, что неправильно CMake искать переменную NETCDF_DIR и в этот поиск netcdf.h но в моем CmakeList и в моем ENV, что переменная не определена ,

Как CMake найти C var? и как я могу ответить на поиск fortran lib?

Благодаря мне помочь

С наилучшими пожеланиями

Эрик

+1

ли вы на самом деле означает 'netcdff.mod' или вы хотите' netcdf.mod'? Кроме того, я действительно не знаю 'cmake', но если похоже, что вы пытаетесь сохранить в' NETCDFF_INCLUDES_F90', но тогда ваше сообщение использует '$ {NETCDF_INCLUDES_F90}' (т.есть дополнительный F в первом) –

+0

благодаря вашему ответу, в копии и вставке есть некоторые ошибки. Правильный файл модуля - netcdf.mod, а сообщение - в NETCDFF_INCLUDES_F90, я исправляю свой предыдущий пост. – epascolo

+0

какая версия CMake вы используете? – fedepad

ответ

1

Может быть, у меня это не ответ сам по себе, но не могли бы вы просто использовать FindNetCDF.cmake поставляется с ВТК?
https://github.com/Kitware/VTK/blob/master/CMake/FindNetCDF.cmake
Или один из других пользователей, похожий на предыдущий (они могут искать компоненты Fortran и C)?
https://github.com/bilke/cmake-modules/blob/master/FindNetCDF.cmake
https://github.com/jedbrown/cmake-modules/blob/master/FindNetCDF.cmake
Если включить этот файл, то вы можете просто получить необходимые компоненты с помощью:

set (NETCDF_F90 "YES") 
find_package (NetCDF REQUIRED) 
include_directories(${NETCDF_INCLUDES}) 
target_link_libraries (uses_f90_interface ${NETCDF_LIBRARIES}) 
target_link_libraries (only_uses_c_interface ${NETCDF_LIBRARIES_C}) 

или в случае ВТК версии что-то вроде

find_package (NetCDF COMPONENTS F90) 
include_directories(NETCDF_F90_INCLUDE_DIRS) 
target_link_libraries (only_uses_f90_interface ${NETCDF_F90_LIBRARIES}) 

Как указано по версии VTK вы можете передавать разные каталоги поиска для библиотек C и Fortran через:

Когда интерфейсы запрашиваются пользователь имеет доступ к интерфейсу конкретные советы:

NETCDF_${LANG}_INCLUDE_DIR - where to search for interface header files 
NETCDF_${LANG}_LIBRARY  - where to search for interface libraries 
+0

Я пробовал пример, но все они запускаются только в том случае, если C и Fortran lib находятся в одном каталоге. Потому что, во-первых, скрипт находит местоположение C libs и после поиска другой в том же каталоге. – epascolo

+0

обновленный ответ, так как вы можете указать разные каталоги поиска для включений и библиотек, когда вы запрашиваете языковые интерфейсы ... – fedepad

+0

Спасибо за помощь. Попробую ваше предложение! – epascolo