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 :

Cmake, boost, et no debug option


Sujet :

C++

  1. #1
    Membre éclairé Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Par défaut Cmake, boost, et no debug option
    Bonjour à toutes et à tous !

    Quand je compile mon script avec cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -Wall -o3 main_1.cpp -std=c++17 -DNDEBUG -DBOOST_UBLAS_NDEBUG -I/usr/include/gdal  -L/usr/lib/ -lgdal -I/home/becheler/dev
    Tout se passe bien, et ça tourne en quelques secondes.

    Mais quand j'essaie de faire la même avec un CMakeLists.txt, baaaah, ça compile mais ça met une plombe à l'exécution. Je dois mal m'y prendre avec cmake parce que l'option -DBOOST_UBLAS_NDEBUG semble ne pas être prise en compte (j'ai de bonnes raisons de croire que l'énorme ralentissement du code que j'ai proviens de là). J'ai essayé de bidouiller en tentant différents trucs mais ... fail !

    Pourriez-vous m'aider je vous prie ? Voici mon CMakeLists.txt actuel:
    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 2.8)
     
    project(quetzal)
     
    add_compile_options(-Wall -pedantic-errors -Wextra -std=c++17 -ofast)
     
    FIND_PACKAGE(Boost)
    IF (Boost_FOUND)
        INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
        ADD_DEFINITIONS( "-DHAS_BOOST -DBOOST_UBLAS_NDEBUG" ) # ça semble pas marcher
    ENDIF()
     
    # j'ai aussi essayé
    # add_definitions(-DBOOST_UBLAS_NDEBUG) #sans plus de succès
     
    FIND_PACKAGE(GDAL)
    IF (GDAL_FOUND)
        INCLUDE_DIRECTORIES(${GDAL_INCLUDE_DIR})
    ENDIF()
     
    include_directories( ./ )
     
    add_executable(expansion_1 documentation/code_examples/expansion/main_1.cpp)
    TARGET_LINK_LIBRARIES(expansion_1 LINK_PUBLIC ${GDAL_LIBRARY} )
    Merci !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 145
    Billets dans le blog
    4
    Par défaut
    Ça n'a peut-être rien à voir mais pourquoi les quotes autour des définitions ?
    https://cmake.org/cmake/help/v3.8/co...finitions.html

    j'ai de bonnes raisons de croire que l'énorme ralentissement du code que j'ai proviens de là
    Quelles sont ces raisons ?
    L'exe compilé a-t-il une taille significativement différente ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre éclairé Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Par défaut
    J'ai enlevé les guillemets, cela n'a rien changé.

    Quelles sont ces raisons ?
    L'exe compilé a-t-il une taille significativement différente ?
    Compilé avec Cmake, l'exé a une taille de 230.9 kB
    Compilé a la main, l'exé a une taille de 1.2 MB.

    Je faisais pour ma part plutôt allusion a d'anciennes galères d’exécution de programme interminable, qui avait été résolu avec avec cette fameuse option de compilation -DBOOST_UBLAS_NDEBUG.
    L'explication vaut ce qu'elle vaut ...

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 435
    Par défaut
    C'est pas la version "-g" que vous générez via Cmake ???

  5. #5
    Membre éclairé Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Par défaut
    Salut bacelar

    Si par la tu entends que je n'ai pas rajoute l'option -DNDEBUG, c'est parce que j'appelle cmake avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cmake -DCMAKE_BUILD_TYPE=Release ..
    make
    Ce qui normalement devrait rajouter l'option -DNDEBUG, non ?

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 750
    Par défaut
    Pas sûr que tu compares les bons exécutables. Sur la ligne de commande de gcc il y a -o3 et dans le CmakeLists -ofast. Or, -o est l'option pour nommé le fichier de sortie, celle pour les optimisations est en majuscule: -O.

    Tu peux faire make VERBOSE=1 pour avoir les lignes de compilation, et voir s'il manque vraiment -DHAS_BOOST -DBOOST_UBLAS_NDEBUG.

    -DCMAKE_BUILD_TYPE=Release active bien NDEBUG. Pour bien faire, il faudrait aussi que -Ofast ne s'active qu'en Realease, par défaut ce doit être un -O2.

    Il faut utiliser set(CMAKE_CXX_STANDARD 17) à la place de -std=c++17. Sans, cmake peut définir une autre version du standard.

  7. #7
    Membre éclairé Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Par défaut
    Citation Envoyé par jo_link_noir Voir le message
    Pas sûr que tu compares les bons exécutables. Sur la ligne de commande de gcc il y a -o3 et dans le CmakeLists -ofast. Or, -o est l'option pour nommé le fichier de sortie, celle pour les optimisations est en majuscule: -O.

    Ah ouais. Omg. Violent. Beuah. Ca fait juste 3 ans que je renomme mes fichiers au lieu de les optimiser. La grande claaasse.
    En tout cas merci d'avoir relevé cette mécompréhension typographique, en vrai je trouvais curieux que l'option d'optimisation change aussi le nom de l'exécutable. Prrrrffff je m'auto-gonfle.

    Citation Envoyé par jo_link_noir Voir le message
    Tu peux faire make VERBOSE=1 pour avoir les lignes de compilation, et voir s'il manque vraiment -DHAS_BOOST -DBOOST_UBLAS_NDEBUG.
    Merci je vais faire ça !

    Citation Envoyé par jo_link_noir Voir le message
    -DCMAKE_BUILD_TYPE=Release active bien NDEBUG. Pour bien faire, il faudrait aussi que -Ofast ne s'active qu'en Realease, par défaut ce doit être un -O2.
    Ah oui pas bête !

    Citation Envoyé par jo_link_noir Voir le message
    Il faut utiliser set(CMAKE_CXX_STANDARD 17) à la place de -std=c++17. Sans, cmake peut définir une autre version du standard.
    "Définir une autre version du standard"... Cette phrase me laisse décidément songeur... Mais ok je fais ça !

  8. #8
    Membre éclairé Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Par défaut
    Bon, de retour du front.
    J'ai suivi les conseils de jo_link_noir, et après quelques bidouilles pour faire coincider les lignes de compilation, je suis arrivé à faire tourner la bestiole. Ce que je trouve bizarre, c'est qu'activer une option d'optimisation fait buguer (ou ralentir) le programme
    Un avis là dessus ?

    CMakeLists.txt :
    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_minimum_required(VERSION 2.8)
     
    project(quetzal)
     
    set(CMAKE_CXX_STANDARD 17)
    add_compile_options(-Wall -pedantic-errors -Wextra -DNDEBUG)
     
    FIND_PACKAGE(Boost)
    IF (Boost_FOUND)
        INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
        ADD_DEFINITIONS(-DBOOST_UBLAS_NDEBUG)
    ENDIF()
     
    FIND_PACKAGE(GDAL)
    IF (GDAL_FOUND)
        INCLUDE_DIRECTORIES(${GDAL_INCLUDE_DIR})
    ENDIF()
     
    include_directories( ./ )
     
    add_executable(expansion_1 documentation/code_examples/expansion/main_1.cpp)
    TARGET_LINK_LIBRARIES(expansion_1 LINK_PUBLIC ${GDAL_LIBRARY} )
    Un bout de la sortie du cmake VERBOSE=1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /usr/bin/c++  -DBOOST_UBLAS_NDEBUG -I/usr/include/gdal -I/home/becheler/dev/quetzal/.  -Wall -pedantic-errors -Wextra -DNDEBUG -std=gnu++1z -o CMakeFiles/expansion_1.dir/documentation/code_examples/expansion/main_1.cpp.o -c /home/becheler/dev/quetzal/documentation/code_examples/expansion/main_1.cpp

  9. #9
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 750
    Par défaut
    Étrange, il n'y a aucune option d'optimisation dans ce que tu donnes. Tu es bien dans un dossier initialisé avec cmake -DCMAKE_BUILD_TYPE=Release ? Ou alors les options par défaut sont à la ramasse .

    Tu peux regarder dans le fichier CMakeCache.txt les options associées à chaque type de build et au besoin les modifier.

  10. #10
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Commence par utiliser cmake avec une version moins périmée, donc, exige au moins la "3.0"
    Auquel cas, tu auras accès aux définitions de propriétés. Ca te sera utile lorsque tu commenceras à écrire des bibliothèques.

    Code cmake : 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.8) # première version à supporter C++17
     
    project(quetzal)
     
    find_package(Boost)
    find_package(GDAL)
     
    # force all compilation in this project with those options.
    add_compile_options(-Wall -pedantic-errors -Wextra)
     
    add_executable(expansion_1 documentation/code_examples/expansion/main_1.cpp)
    set_target_properties(expansion_1 PROPERTIES CXX_EXTENSIONS OFF) # prefer iso standards to compiler extensions ones.
    target_compile_features(expansion_1 PUBLIC cxx_std_17)
     
    target_include_directories(expansion_1 PRIVATE .)
     
    if(Boost_FOUND)
      target_include_directories(expansion_1 PRIVATE ${Boost_INCLUDE_DIR})
      target_compile_definitions(expansion_1 PRIVATE BOOST_UBLAS_NDEBUG)
    endif()
     
    if(GDAL_FOUND)
      target_include_directories(expansion_1 PRIVATE ${GDAL_INCLUDE_DIR})
      target_link_libraries(expansion_1 PUBLIC ${GDAL_LIBRARY} )
    endif()

    Ensuite, je t'invite à lire la documentation sur les "CMAKE_BUILD_TYPE", dont la valeur par défaut est "aucun réglages"
    CMAKE_BUILD_TYPE=Release permet de rajouter des options "-O3 -DNDEBUG" (en général).

    Et n'hésite pas à utiliser ccmake pour éditer ton cache ou même faire ta génération.

  11. #11
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2003
    Messages : 120
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jo_link_noir Voir le message
    Il faut utiliser set(CMAKE_CXX_STANDARD 17) à la place de -std=c++17. Sans, cmake peut définir une autre version du standard.
    merci pour l'astuce ! ^^

  12. #12
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Salut,

    Juste un truc:

    Quand tu places la ligne
    Citation Envoyé par ternel Voir le message
    Code cmake : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <snip>
    add_compile_options(-Wall -pedantic-errors -Wextra)
    <snip>
    Tu forces l'utilisation d'options spécifiques à Gcc (et, heureusement supportées par clang) quel que soit le compilateur considéré.

    Ce n'est pas catastrophique tant que tu n'envisage d'utiliser que ces deux compilateurs, mais ce sont des options qui risquent d'être rejetées en bloc par VC++, pour ne citer que celui là

    De plus, cela fait déjà plusieurs versions de Gcc que l'on conseille d'utiliser l'option --all-warnings à la place de -Wall et l'option --extra-warnings à la place de -WextraJe sais bien que Wall et Wextra sont les options "historiques", mais, comme on ne peut pas garantir qu'elles ne seront pas supprimées dans le futur (du simple fait qu'il existe une alternative plus récente), il me semble préférable d'utiliser --all-warnings et --extra-warnings
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  13. #13
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 510
    Par défaut
    Citation Envoyé par koala01 Voir le message
    De plus, cela fait déjà plusieurs versions de Gcc que l'on conseille d'utiliser l'option --all-warnings à la place de -Wall et l'option --extra-warnings à la place de -WextraJe sais bien que Wall et Wextra sont les options "historiques", mais, comme on ne peut pas garantir qu'elles ne seront pas supprimées dans le futur (du simple fait qu'il existe une alternative plus récente), il me semble préférable d'utiliser --all-warnings et --extra-warnings
    Dans la documentation de GCC 8.2 sur les avertissements, je ne vois ni --all-warnings, ni --extra-warnings.

  14. #14
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Faut les cherchr un peu

    Ma version de Gcc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    gcc -v
    Utilisation des specs internes.
    COLLECT_GCC=gcc
    COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/8/lto-wrapper
    OFFLOAD_TARGET_NAMES=nvptx-none
    OFFLOAD_TARGET_DEFAULT=1
    Cible : x86_64-linux-gnu
    Configuré avec: ../src/configure -v --with-pkgversion='Debian 8.2.0-9' --with-bugurl=file:///usr/share/doc/gcc-8/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-8 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
    Modèle de thread: posix
    gcc version 8.2.0 (Debian 8.2.0-9)
    Demandons l'aide au sujet des warnings
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    gcc --help=warnings
    Les options suivantes contrôlent les messages d’avertissement du compilateur:
      --all-warnings              Comme -Wall. Utilisez plutôt cette dernière
                                  option.
      --extra-warnings            Comme -Wextra. Utilisez plutôt cette dernière
                                  option.
      -W                          This switch is deprecated; use -Wextra instead. 
                                  Comme -Wextra.
    (...)
      -Wextra                     Afficher des avertissements complémentaires (au
                                  risque qu'ils soient non désirés).
    Bon, ce n'est pas dans la doc officielle (qui manque de mise à jour, de toute évidence), mais, comme c'est dans l'aide officielle du programme, on devrait pouvoir s'y fier, non?
    [/CODE]
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  15. #15
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 750
    Par défaut
    --all-warnings Comme -Wall. Utilisez plutôt cette dernière option.
    La dernière fait référence à -Wall.

    S'il faut les chercher c'est bien parce que personne ne les recommande, rien que dans les derniers changelogs il y a plusieurs références à -Wall. Ce qui est plutôt logique puisque les options de gcc sont avec un seul tiret et les avertissements préfixés de W. --all-warnings et --extra-warnings sont des extraterrestres là-dedans.

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

Discussions similaires

  1. CMake, boost 1.55.0, Visual 2015, 2013
    Par Suryavarman dans le forum Visual C++
    Réponses: 6
    Dernier message: 04/06/2017, 12h53
  2. [VC++6][DLL][WinXP]option de compilation debug/release
    Par ben_popcorn dans le forum Visual C++
    Réponses: 7
    Dernier message: 02/02/2007, 10h25
  3. Option Debug dans access
    Par uskiki85 dans le forum Access
    Réponses: 11
    Dernier message: 26/09/2005, 15h15
  4. Différences entre Debug et Retail dans le fichier d'options
    Par zoubidaman dans le forum C++Builder
    Réponses: 3
    Dernier message: 08/04/2005, 17h40

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