IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

NetCDF en C++ avec CMake


Sujet :

C++

  1. #1
    Membre confirmé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 186
    Points : 604
    Points
    604
    Par défaut NetCDF en C++ avec CMake
    Salut à tous !

    Je dois lire des fichiers au format NetCDF en C++. Pour construire mon projet, j’utilise CMake. Cependant, j’ai quelques difficultés avec la bibliothèque NetCDF, de toute évidence je ne parviens pas à réaliser l’édition des liens. J’ai réalisé un exemple complet minimal pour montrer mon problème. Soit le contenu du fichier « main.cpp » suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>
    #include <netcdf>
     
    int main (int argc, char** argv) {
    	if (argc != 2) {
    		std::cerr << "Usage*: " << argv[0] << " nom_fichier\n";
    		return -1;
    	}
     
        netCDF::NcFile dataFile (argv[1], netCDF::NcFile::read);
     
        return 0;
    }
    Ainsi que le fichier « CMakeLists.txt » suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    cmake_minimum_required(VERSION 3.0)
     
    project(TestNetCDF CXX)
     
    set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})
    set(EXECUTABLE_NAME testnetcdf)
     
    find_package(netCDF COMPONENTS CXX)
     
    set(
        SOURCE_FILES
        main.cpp
    )
     
    link_directories(
        ${NETCDF_CXX_LIBRARIES}
    )
    include_directories(
    	${CMAKE_CURRENT_BINARY_DIR}
        ${NETCDF_CXX_INCLUDE_DIRS}
    )
     
    add_executable(
        ${EXECUTABLE_NAME}
        ${SOURCE_FILES}
    )
    target_link_libraries(
        ${EXECUTABLE_NAME}
        ${NETCDF_CXX_LIBRARIES}
    )
    Comme il s’agit d’un exemple complet, certes, mais aussi minimal, j’ai tout mis dans le même répertoire. Après la génération des fichiers de constructions, voici ce que donne la compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ make 
    Scanning dependencies of target testnetcdf
    [ 50%] Building CXX object CMakeFiles/testnetcdf.dir/main.cpp.o
    [100%] Linking CXX executable bin/Debug/testnetcdf
    CMakeFiles/testnetcdf.dir/main.cpp.o*: Dans la fonction «*main*»*:
    /home/lebarsy/Codes/Cloud/essai/netcdf/main.cpp:47*: référence indéfinie vers «*netCDF::NcFile::NcFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, netCDF::NcFile::FileMode)*»
    /home/lebarsy/Codes/Cloud/essai/netcdf/main.cpp:47*: référence indéfinie vers «*netCDF::NcFile::~NcFile()*»
    collect2: error: ld returned 1 exit status
    CMakeFiles/testnetcdf.dir/build.make:94: recipe for target 'bin/Debug/testnetcdf' failed
    make[2]: *** [bin/Debug/testnetcdf] Error 1
    CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/testnetcdf.dir/all' failed
    make[1]: *** [CMakeFiles/testnetcdf.dir/all] Error 2
    Makefile:83: recipe for target 'all' failed
    make: *** [all] Error 2
    Donc, clairement, quelque chose ne va pas au moment de l’édition des liens. Cependant, sur le net, je ne parviens pas à trouver d’où viens le problème. De toute évidence, je ne maîtrise pas le module CMake de NetCDF.

    Pour information, voici ce qui est installé concernant la bibliothèque NetCDF sur ma machine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    $ aptitude search libnetcdf
    i A libnetcdf-c++4                                                                       - legacy NetCDF C++ interface                                                                   
    p   libnetcdf-c++4:i386                                                                  - legacy NetCDF C++ interface                                                                   
    i A libnetcdf-c++4-1                                                                     - C++ interface for scientific data access to large binary data                                 
    p   libnetcdf-c++4-1:i386                                                                - C++ interface for scientific data access to large binary data                                 
    i   libnetcdf-c++4-dbg                                                                   - debugging symbols for NetCDF C++                                                              
    p   libnetcdf-c++4-dbg:i386                                                              - debugging symbols for NetCDF C++                                                              
    i   libnetcdf-c++4-dev                                                                   - creation, access, and sharing of scientific data in C++                                       
    p   libnetcdf-c++4-dev:i386                                                              - creation, access, and sharing of scientific data in C++                                       
    i   libnetcdf-c++4-doc                                                                   - NetCDF C++ API documentation                                                                  
    p   libnetcdf-cxx-legacy-dbg                                                             - debugging symbols for legacy NetCDF C++ interface                                             
    p   libnetcdf-cxx-legacy-dbg:i386                                                        - debugging symbols for legacy NetCDF C++ interface                                             
    p   libnetcdf-cxx-legacy-dev                                                             - legacy NetCDF C++ interface - development files                                               
    p   libnetcdf-cxx-legacy-dev:i386                                                        - legacy NetCDF C++ interface - development files                                               
    i   libnetcdf-dev                                                                        - creation, access, and sharing of scientific data                                              
    p   libnetcdf-dev:i386                                                                   - creation, access, and sharing of scientific data                                              
    i A libnetcdf13                                                                          - Interface for scientific data access to large binary data                                     
    p   libnetcdf13:i386                                                                     - Interface for scientific data access to large binary data                                     
    i   libnetcdff-dbg                                                                       - debugging symbols for NetCDF Fortran                                                          
    p   libnetcdff-dbg:i386                                                                  - debugging symbols for NetCDF Fortran                                                          
    i   libnetcdff-dev                                                                       - creation, access, and sharing of scientific data in Fortran                                   
    p   libnetcdff-dev:i386                                                                  - creation, access, and sharing of scientific data in Fortran                                   
    p   libnetcdff-doc                                                                       - NetCDF Fortran documentation                                                                  
    i A libnetcdff6                                                                          - Fortran interface for scientific data access to large binary data                             
    p   libnetcdff6:i386                                                                     - Fortran interface for scientific data access to large binary data
    Il me semble qu’il y a tout ce qu’il faut.

    Donc, quelqu’un a-t-il déjà réussi à utiliser la bibliothèque NetCDF en C++ avec CMake ? Si oui, comment avez-vous fait ?

    À bientôt.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut

    Je ne connais pas cette lib mais essaie avec pkg-config et le CMakeLists.txt suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    cmake_minimum_required(VERSION 3.0)
    project(TestNetCDF )
     
    set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})
    set(EXECUTABLE_NAME testnetcdf)
     
    find_package( PkgConfig REQUIRED )
    pkg_check_modules( MYPKGS REQUIRED netcdf-cxx4 )
     
    set(
        SOURCE_FILES
        main.cpp
    )
    include_directories(
    	${CMAKE_CURRENT_BINARY_DIR}
      ${MYPKGS_INCLUDE_DIRS}
    )
    add_executable(
        ${EXECUTABLE_NAME}
        ${SOURCE_FILES}
    )
    target_link_libraries(
        ${EXECUTABLE_NAME}
        ${MYPKGS_LIBRARIES}
    )

  3. #3
    Membre confirmé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 186
    Points : 604
    Points
    604
    Par défaut
    Salut à tous !

    Citation Envoyé par SimonDecoline Voir le message
    Je ne connais pas cette lib mais essaie avec pkg-config et le CMakeLists.txt suivant :
    Bien vu pour le contournement par pkg-config, je n’y avais pas pensé. C’est d’autant plus une bonne idée qu’en ce moment je jongle entre Debian, CentOS, Fedora et Ubuntu et qu’en plus je dois garder MacOS et Windows en cibles possibles, avec le constat que le module CMake pour NetCDF n’est pas toujours disponible dans la distribution.

    Cela dit, ça fait avancer, mais ça ne règle pas totalement le problème. En effet, NetCDF se base sur HDF5. Il existe un module FindHDF5.cmake disponible dans toutes les distributions. Par ailleurs, il a également un module pour Pkg-config. Dans les exemples que je vais présenter ici, j’utilise directement le module CMake, mais le résultat est le même avec Pkg-config.

    Soit le fichier CMakeLists.txt suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    cmake_minimum_required(VERSION 3.0)
     
    project(TestNetCDF CXX)
     
    # Path for the executable.
    set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})
    # Name of the executable.
    set(EXECUTABLE_NAME testnetcdf)
     
    find_package(HDF5 COMPONENTS CXX REQUIRED)
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(MYPKGS REQUIRED netcdf-cxx4)
     
    set(
        SOURCE_FILES
        main.cpp
    )
     
    include_directories(
        ${CMAKE_CURRENT_BINARY_DIR}
        ${HDF5_INCLUDE_DIRS}
        ${MYPKGS_INCLUDE_DIRS}
    )
     
    add_executable(
        ${EXECUTABLE_NAME}
        ${SOURCE_FILES}
    )
    target_link_libraries(
        ${EXECUTABLE_NAME}
        ${HDF5_CXX_LIBRARIES}
        ${HDF5_HL_LIBRARIES}
        ${MYPKGS_LIBRARIES}
    )
    Voici le résultat que j’obtiens sous Fedora 28 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    $ cmake .. -G "Unix Makefiles"
    -- The CXX compiler identification is GNU 8.1.1
    -- Check for working CXX compiler: /usr/bin/c++
    -- Check for working CXX compiler: /usr/bin/c++ -- works
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    -- HDF5: Using hdf5 compiler wrapper to determine CXX configuration
    -- Found HDF5: /usr/lib64/libhdf5_cpp.so;/usr/lib64/libhdf5.so;/usr/lib64/libsz.so;/usr/lib64/libz.so;/usr/lib64/libdl.so;/usr/lib64/libm.so (found version "1.8.20") found components:  CXX 
    -- Found PkgConfig: /usr/bin/pkg-config (found version "1.4.2") 
    -- Checking for module 'netcdf-cxx4'
    --   Found netcdf-cxx4, version 4.3.0
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/yoann/program/essai/netcdf/build
     
     
    $ make
    Scanning dependencies of target testnetcdf
    [ 50%] Building CXX object CMakeFiles/testnetcdf.dir/main.cpp.o
    [100%] Linking CXX executable bin/testnetcdf
    [100%] Built target testnetcdf
    Donc, tout va bien dans ce cas-là. En revanche, il y a un problème à l’heure actuelle avec Debian et ses dérivées. Voici un exemple avec Ubuntu 18.04 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    $ cmake .. -G "Unix Makefiles"
    -- The CXX compiler identification is GNU 7.3.0
    -- Check for working CXX compiler: /usr/bin/c++
    -- Check for working CXX compiler: /usr/bin/c++ -- works
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    -- HDF5: Using hdf5 compiler wrapper to determine CXX configuration
    -- Found HDF5: /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5_cpp.so;/usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5.so;/usr/lib/x86_64-linux-gnu/libpthread.so;/usr/lib/x86_64-linux-gnu/libsz.so;/usr/lib/x86_64-linux-gnu/libz.so;/usr/lib/x86_64-linux-gnu/libdl.so;/usr/lib/x86_64-linux-gnu/libm.so (found version "1.10.0.1") found components:  CXX 
    -- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.1") 
    -- Checking for module 'netcdf-cxx4'
    --   Found netcdf-cxx4, version 4.3.0
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/lebarsy/Codes/Cloud/essai/netcdf/build
     
     
    $ make
    Scanning dependencies of target testnetcdf
    [ 50%] Building CXX object CMakeFiles/testnetcdf.dir/main.cpp.o
    [100%] Linking CXX executable bin/testnetcdf
    /usr/bin/ld*: ne peut trouver -lhdf5_hl
    /usr/bin/ld*: ne peut trouver -lhdf5
    collect2: error: ld returned 1 exit status
    CMakeFiles/testnetcdf.dir/build.make:101: recipe for target 'bin/testnetcdf' failed
    make[2]: *** [bin/testnetcdf] Error 1
    CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/testnetcdf.dir/all' failed
    make[1]: *** [CMakeFiles/testnetcdf.dir/all] Error 2
    Makefile:83: recipe for target 'all' failed
    make: *** [all] Error 2
    Dans ce cas, je ne parviens toujours pas au bout de l’édition des liens. Comme dit plus haut, l’erreur est la même en utilisant Pkg-config pour HDF5 également. Par ailleurs, je constate qu’il y a deux bogues ouverts concernant les modules Pkg-config et CMake de HDF5 sous Debian :

    https://bugs.debian.org/cgi-bin/bugr...cgi?bug=839784
    https://bugs.debian.org/cgi-bin/bugr...cgi?bug=767537

    Du coup, il faut que je trouve un moyen de contourner ce problème, mais que le tout reste portable… Pour tout dire, je ne sais pas comment faire.

    Pour aider, voici quelques éléments détaillant la configuration sous Ubuntu 18.04 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ pkg-config --cflags hdf5
    -I/usr/include/hdf5/serial
     pkg-config --libs hdf5
    -L/usr/lib/x86_64-linux-gnu/hdf5/serial -lhdf5
    $ ls /usr/lib/x86_64-linux-gnu/hdf5/serial/
    include  libhdf5.a      libhdf5_cpp.so     libhdf5_fortran.so  libhdf5_hl_cpp.a   libhdf5hl_fortran.a   libhdf5_hl.so     libhdf5.so
    lib      libhdf5_cpp.a  libhdf5_fortran.a  libhdf5_hl.a        libhdf5_hl_cpp.so  libhdf5hl_fortran.so  libhdf5.settings
    Quelqu’un a-t-il une idée pour me sortir de ce mauvais pas ?

    À bientôt.

  4. #4
    Invité
    Invité(e)
    Par défaut
    ajoute la variable ${MYPKGS_LDFLAGS}

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    cmake_minimum_required(VERSION 3.0)
     
    project(TestNetCDF )
     
    set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})
    set(EXECUTABLE_NAME testnetcdf)
     
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(MYPKGS REQUIRED netcdf-cxx4 )
     
    set(
    	SOURCE_FILES
    	main.cpp
    	)
    include_directories(
    	${CMAKE_CURRENT_BINARY_DIR}
    	${MYPKGS_INCLUDE_DIRS}
    	)
    add_executable(
    	${EXECUTABLE_NAME}
    	${SOURCE_FILES}
    	)
    target_link_libraries(
    	${EXECUTABLE_NAME}
    	${MYPKGS_LIBRARIES}
    	${MYPKGS_LDFLAGS}
    	)

  5. #5
    Membre confirmé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 186
    Points : 604
    Points
    604
    Par défaut
    Salut à tous !

    Citation Envoyé par SimonDecoline Voir le message
    ajoute la variable ${MYPKGS_LDFLAGS}
    Bon, décidément, je ne maîtrise pas suffisamment l’interaction entre CMake et Pkg-config. Voici le fichier CMakeLists.txt auquel je suis parvenu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    cmake_minimum_required(VERSION 3.0)
     
    project(TestNetCDF CXX)
     
    # Path for the executable.
    set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})
    # Name of the executable.
    set(EXECUTABLE_NAME testnetcdf)
     
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(MYPKGS REQUIRED netcdf-cxx4)
     
    set(
        SOURCE_FILES
        main.cpp
    )
     
    include_directories(
        ${CMAKE_CURRENT_BINARY_DIR}
        ${MYPKGS_INCLUDE_DIRS}
    )
     
    add_executable(
        ${EXECUTABLE_NAME}
        ${SOURCE_FILES}
    )
    target_link_libraries(
        ${EXECUTABLE_NAME}
        ${MYPKGS_LIBRARIES}
        ${MYPKGS_LDFLAGS}
    )
    J’ai testé Sous Fedora 28 et Ubuntu 18.04, ça fonctionne dans les deux cas. Je n’ai pas encore testé sous Debian ni CentOS, mais je pense que ça devrait aller. Si jamais je ne donne pas de nouvelle, c’est que tout va bien.

    Merci, donc : problème résolu.

    À bientôt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. un problème avec cMake
    Par hamta dans le forum Systèmes de compilation
    Réponses: 4
    Dernier message: 27/11/2008, 09h20
  2. probleme avec cmake
    Par nina08 dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 19/05/2008, 09h43
  3. aidez moi à travailler avec cmake
    Par mohus08 dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 15/05/2008, 11h01
  4. Compilation d'un exemple avec cmake
    Par ChipsterJulien dans le forum Boost
    Réponses: 0
    Dernier message: 19/03/2008, 17h16
  5. Problème avec cmake : signification d'une erreur
    Par G3G3 dans le forum Systèmes de compilation
    Réponses: 0
    Dernier message: 25/10/2007, 11h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo