frouin.me

GNU Cross Compiler

Introduction

user

Jean-Michel Frouin

CTO @ WakeOnWeb.com


gcc cpp

GNU Cross Compiler

Posted by Jean-Michel Frouin on .
Featured

gcc cpp

GNU Cross Compiler

Posted by Jean-Michel Frouin on .

Options

-IRépertoire : Ajoute un répertoire à la liste des répertoires connus par le compilateur et dans lesquels, il va rechercher les fichiers inclus avec la directive #include.
-g : Inclus les symboles de debug, sans cela pas moyen d'utiliser gdb.
-Wall : Active tous les warnings lors de la compilation.
-MD : Générer automatiquement les dépendances (fichier *.d).
-pg -fprofile-arcs -ftest-coverage : Active l'analyse de coverage. Puis lancer gcov source.cpp.
-S : Produit le fichier assembleur.
-E : Produit le fichier précompilé.

Macros du préprocesseur

Un site regroupe l'intégralité des macros C/C++ les plus communes, organisées par plateforme et compilateur.

__STDC__ : Définie si le compilateur est conforme à la norme AINSI C. Désactivé si l'option \textit{-traditional-cpp} est activée.
__STDC_VERSION__ : Version de la norme AINSI au format AAAAMML. Désactive si l'option \textit{-traditional-cpp} est activée.
__GNUC__ : Numéro de version majeure.
__GNUC_MINOR__ : Numéro de version mineure.
__GNUC_PATCHLEVEL__ : Numéro de patch.
__FILE__ : Nom du fichier compilé.
__BASE_FILE__ : Nom du fichier contenant le point d'entrée du programme.
__LINE__ : Ligne de compilation. Il est possible de la redéfinir avec \textit{\#line}\index{\#line}
__DATE__ : Date de compilation au format : Mai 17 2007.
__TIME__ : Heure de compilation au format : 19:26:01.
__TIMESTAMP__ : Date et heure de compilation.
__STDC_HOSTED__ : Définition ?
__cplusplus : Numéro de version du compilateur C++. Quand le compilateur est conforme la norme cette macro vaut 199711L.
__ASSEMBLER__ : Défini quand le compilateur compile l'assembleur en binaire.
__GNUG__ <=> __GNUC__ <=> __cplusplus
__INCLUDE_LEVEL__ : Niveau d'inclusion du fichier compilé.
__ELF__ : Définie si la cible utilise le format ELF.
__VERSION__ : Version du compilateur.
__OPTIMIZE__ : Définie durant une compilation optimisée.
__OPTIMIZE_SIZE__ : Définie durant une compilation optimisée en taille non en vitesse.
__NO_INLINE__ : Définie si les fonctions inline, ne le sonts plus. Soit parce que le compilateur n'optimise pas, soit car l'option \textit{-fno-inline} est active.
__GNUC_GNU_INLINE__ : Définie quand les fonctions inline sont gérées par le mode gnu89.
__GNUC_STDC_INLINE__ : Définie quand les fonctions inline sont gérées par le mode ISO C99.
__CHAR_UNSIGNED__ : Utilisé par limits.h.
__WCHAR_UNSIGNED__ : Définie quand le type wchar_t non signé.
__REGISTER_PREFIX__ : Préfixe des registres dans l'assembleur de la machine.
__USER_LABEL_PREFIX__ : Préfixe des labels dans l'assembleur de la machine. Fonctionne même si \textit{-f(no-)underscores} est défini.
__SIZE_TYPE__ :
__PTRDIFF_TYPE__ :
__WCHAR_TYPE__ :
__WINT_TYPE__ :
__INTMAX_TYPE__ :
__UINTMAX_TYPE__ : \multirow{-5}{8cm}{Utilisées par stddef.h et wchar.h.}

__CHAR_BIT__ : Nombre de bits d'un char.
__SCHAR_MAX__ :
__WCHAR_MAX__ :
__SHRT_MAX__ :
__INT_MAX__ :
__LONG_MAX__ :
__LONG_LONG_MAX__ :
__INTMAX_MAX__ : \multirow{-6}{8cm}{Utilisées par les limites numériques uniquement.}
__SIZEOF_INT__ :
__SIZEOF_LONG__ :
__SIZEOF_LONG_LONG__ :
__SIZEOF_SHORT__ :
__SIZEOF_POINTER__ :
__SIZEOF_FLOAT__ :
__SIZEOF_DOUBLE__ :
__SIZEOF_LONG_DOUBLE__ :
__SIZEOF_SIZE_T__ :
__SIZEOF_WCHAR_T__ :
__SIZEOF_WINT_T__ :
__SIZEOF_PTRDIFF_T__ : \multirow{-11}{8cm}{Taille des types.}
__DEPRECATED : Définie si les messages d'avertissements de préemption sont activés. Ils peuvent être désactivés par l'option \textit{-Wno-deprecated}.
__EXCEPTIONS : Définie quand le compilateur compile un code source C++ avec les exceptions activées. On peut les désactiver en utilisant l'option \textit{-fno-exceptions}.
__USING_SJLJ_EXCEPTIONS__ : Utilise l'ancien système de gestion d'exceptions ( base de setjmp et de longmp).
__GXX_EXPERIMENTAL_CXX0X__ : \textbf{Exprimental}. Définie si les options \textit{-std=c++0x} ou \textit{-std=gnu++0x}.
__GXX_WEAK__ : Utilisée pour faciliter l'implémentation du runtime C++.
__LP64__ ou _LP64 : Définie si le compilateur gre les entiers longs et les pointeurs 64 bits, ainsi que les entiers sur 32 bits.
__SSP__ : Définie si l'option \textit{-fstack-protector} est utilisée.
__SSP_ALL__ : Définie si l'option \textit{-fstack-protector-all} est utilisée.

Précompilation

Conditions

Il est possible d'inclure différentes parties de code en utilisant des blocs conditionnels de précompilation.

Deux types de blocs existent, le premier basé sur #ifdef, le second sur #if.

Les voici :

#ifdef LONGUEUR //ou #if defined ...
    ...
#else
    ...
#endif

ou sa contraposée :

#ifndef LONGUEUR // ou #if not defined ...
    ...
#else
    ...
#endif
#if (LONGUEUR :: LARGEUR)
    ...
#elif (VOLUME)
    ...
#else
    ...
#endif

Erreurs et warnings

Le compilateur GNU ajoute deux directives, permettant de générer des erreurs et des warnings.

Ainsi pour générer une erreur lors de la compilation, on utilise la directive #error :

#ifndef LEAKS
    #error "Detection de fuites memoire desactivee"
#endif

Ou alors pour ne générer qu'un warning : \#warning

#ifndef LEAKS
    #warning "Detection de fuites memoire desactivee"
#endif

Inclusion

Il est possible d'inclure un autre fichier, en utilisant la directive très connue, et utilisée :

#include , si il s'agit d'un fichier se trouvant dans un des répertoires dans lesquels le compilateur va chercher les fichiers sources.

#include "fichier", si il s'agit d'un fichier se trouvant dans le répertoire de compilation.

Observer la précompilation

gcc -E file.cpp > file_precomp.cpp
Macro

Il est possible d'utiliser la directive #define pour remplacer un identifiant par le texte correspondant. Ainsi, en définissant #define LONGUEUR 100 le compilateur remplacera toutes les occurences de LONGUEUR par 100 dans le code source lors de la précompilation.

Il est possible d'annuler un #define en utilisant la directive #undef. Ainsi pour annuler, on utilise #undef LONGUEUR par exemple.

Pragma

La directive #pragma sert à utiliser des commandes de précompilations définies par le compilateur.

Désactiver un warning GCC depuis les sources.

// disable for this header only
#pragma warning(push)
#pragma warning(disable:4512)
#pragma warning(disable:4180)
#include <boost/lambda/lambda.hpp>
// restore original warning level
#pragma warning(pop)

user

Jean-Michel Frouin

https://frouin.me

CTO @ WakeOnWeb.com