Affichage des articles dont le libellé est GCC. Afficher tous les articles
Affichage des articles dont le libellé est GCC. Afficher tous les articles

26 avril 2025

__cplusplus_xxxxxx 202401


Ce qui suit est sous Windows avec MinGW64, mais c'est la même logique sous Linux

Le but est de savoir quelles versions de C++ une version de gcc supporte et, pour une version de gcc donnée, quels sont les aspects de la norme qui sont effectivement supportés.

 

1/ Comparons la sortie de deux versions de gcc :

==== MinGW13  ========================================================

$ gcc.exe --version
gcc.exe (x86_64-posix-seh-rev1, Built by MinGW-Builds project) 13.1.0

$ gcc.exe -dM -E -x c++ - < /dev/null | grep cplus
#define __cplusplus 201703L


Par défaut gcc 13 se conforme à c++17.

$ gcc.exe -std=c++23 -dM -E -x c++ - < /dev/null | grep cplus
#define __cplusplus 202100L

on peut lui demander explicitement c++20 et c++23

$ gcc.exe -std=c++26 -dM -E -x c++ - < /dev/null | grep cplus
gcc.exe: error: unrecognized command-line option '-std=c++26'; did you mean '-std=c++20'?

mais pas le futur standard c++26.

==== MinGW14 =========================================================

$ gcc --version
gcc.exe (x86_64-posix-seh-rev2, Built by MinGW-Builds project) 14.2.0

$ gcc -dM -E -x c++ - < /dev/null | grep cplus
#define __cplusplus 201703L


Par défaut gcc 14, comme gcc 13, se conforme à c++17.

$ gcc -std=c++23 -dM -E -x c++ - < /dev/null | grep cplus
#define __cplusplus 202302L

Il supporte aussi c++20 et c++23

$ gcc -std=c++26 -dM -E -x c++ - < /dev/null | grep cplus
#define __cplusplus 202400L

et supporte partiellement c++26 avec la macro __cplusplus définit à '202400' !!

 

2/ Pour savoir quels aspects du langage c++ sont supportés par gcc il faut lui demander de lister tous les #define _cpp_xxxx qu'il génère. En les triant par ordre chronologique il est alors facile de voir les nouveautés:


$ gcc -std=c++23 -dM -E -x c++ - < /dev/null | grep __cpp | sort -k3
#define __cpp_runtime_arrays 198712L
#define __cpp_exceptions 199711L
#define __cpp_rtti 199711L
...
#define __cpp_consteval 202211L
#define __cpp_constexpr 202211L
#define __cpp_multidimensional_subscript 202211L


$ gcc -std=c++26 -dM -E -x c++ - < /dev/null | grep __cpp | sort -k3
#define __cpp_runtime_arrays 198712L
#define __cpp_exceptions 199711L
#define __cpp_rtti 199711L
...
#define __cpp_consteval 202211L
#define __cpp_multidimensional_subscript 202211L
#define __cpp_constexpr 202306L
#define __cpp_placeholder_variables 202306L
#define __cpp_static_assert 202306L

Avec ces commandes vous savez la version par défaut supportée par gcc, et vous savez le degré d’adhésion aux différents aspects du langage.

Pour savoir ce qui vous attend vous pouvez suivre au jour le jour le développement de gcc ici 

02 janvier 2022

C++ Search Engine

C++
The C++ search engine

See also: CodeBrowser, libstdc++, grepperAwesome C++ 
SearchEngine for Qt
 
--- Ajouter ce search engine à Firefox ---

21 juillet 2014

Recherche des lib et dll



Quand on ajoute la librairie XYZ a un projet C/C++ il y a trois informations à donner au compilateur et linkeur :
  1. Le répertoire où se trouve les entêtes des fonctions et classes  (-I /path/to/headers)
  2. Le répertoire où se trouve la librairie (-L /path/to/libs)
  3. Le nom de de la librairie (-l XYZ)
Ce qui est perturbant c’est que bien souvent le nom réel du fichier de cette librairie n’est pas juste ‘XYZ’. En fait quand vous passez l’option "-l XYZ" au linkeur de gcc sous Windows voici, dans l'ordre de recherche, les 7 noms de fichiers qui seront cherché par gcc :





  | "lib" | “XYZ”  | ".dll" | ".a" | ".lib" | Nom cherché
  +-------+--------+--------+------+--------|
1 |   X   |   X    |   X    |  X   |        | libXYZ.dll.a
  +-----------------------------------------|
7 |       |   X    |   X    |  X   |        | XYZ.dll.a
  +-----------------------------------------|
3 |       |   X    |        |  X   |        | XYZ.a
  +-----------------------------------------|
4 |       |   X    |        |      |    X   | XYZ.lib
  +-----------------------------------------|
5 |   X   |   X    |   X    |      |        | libXYZ.dll
  +-----------------------------------------|
6 |       |   X    |   X    |      |        | XYZ.dll
  +-----------------------------------------|
7 |   X   |   X    |        |  X   |        | libXYZ.a
  +-----------------------------------------|


Ceci est répété pour chaque chemin par défaut et pour chaque chemin définit par l'option -L /path/to/libs  jusqu’à ce que l’un de ces 7 noms soit trouvé.

Notez que toutes les combinaisons ne sont pas testées: libXYZ.lib ne sera pas cherché par le linkeur.

17 juillet 2014

GCC Cygwin MinGW and co


GCC est LA suite de compilation du projet GNU, surtout connue pour son compilateur C/C++ mais qui peut aussi compiler Ada, Fortran, Go, Java.

Bien sur on retrouve gcc sur tout les systèmes GNU (bsd, linux) mais aussi sur les Unix propriétaires (Aix, HPUX, MacOS, Solaris ...) et sous Windows. Ce qui fait de gcc LE système de compilation multi plates-formes par excellence.

Sous Windows, même si Microsoft propose, via les éditions “Express”, des versions allégées mais gratuites de sa suite Visual Studio on peut vouloir utiliser un compilateur multi plate-forme, multi langages, open source, avec des mises à jour régulières et conforme aux standards. Dans ce cas gcc est LE bon choix.


GNU GCC sous WINDOWS

Cygwin est une environnement très complet permettant de simuler un environnement POSIX (Unix, Linux, BSD) sous Windows. Les exécutables produits par cygwin/gcc dans cet environnement sont dépendants d’une DLL (cygwin1.dll) émulant l'environnement POSIX sous Windows.

Note : Microsoft Windows Services for Unix (SFU) est un environnement Unix/Posix développé par Microsoft, gratuit mais pas open source, proche de cygwin. SFU 3.5 inclus gcc 3.3. Une version allégée de SFU est incluse dans Win7 Enterprise et Ultimate.


MinGW (Minimalist GNU for Windows) est un portage des principaux outils de développement GNU sous Windows. Les exécutables produits par MinGW/gcc utilisent directement les DLL de Microsoft fournies avec Windows et ne nécessitent pas de couche d’émulation comme avec cygwin.

Actuellement MinGW fonctionne sur Windows 32 et 64 bits mais ne permet de produire que des exécutables 32 bits.

Optionnellement MinGW propose une ligne de commande Unix (bash) et quelques outils du monde Unix (grep, make …). Cet environnement Unix optionnel s’appelle MSYS et est basé sur cygwin mais il ne sert pas à produire des exécutables POSIX comme cygwin. MSYS est juste une facilité pour faire du ‘./configure et make’.

MinGW-w64 est un fork (non voulu) de MinGW. Son gros avantage est de pouvoir produire des exécutables 32 et 64 bits.

TDM-GCC de Twilight Dragon Media et une légère variante et un mix de MinGW et MinGW-w64.
Ces variantes sont principalement de nouvelles options pour gérer les exceptions suivant plusieurs méthodes : SJLJ, DWARF, SEH.

MingGW-builds même buts que TDM-GCC mais plus confidentiel.



GCC et les IDE C++ MULTI PLATE-FORME (Windows, Linux, Mac)

Le compilateur C/C++ de Microsoft fonctionne en ligne de commande mais est surtout réputé pour son interface graphique de qualité : Visual Studio. Mais Visual Studio n’est disponible que sous Windows. Heureusement il existe des environnements de développement graphiques multi plates-formes (Windows, Linux, Mac) utilisant le compilateur C/C++ de gcc. Voici les 3 principaux:

Code::Blocks Le compilateur par défaut pour Windows de Code::Blocks est TDM-GCC mais MinGW/gcc, cygwin/gcc, MSVC, BorlandC++, Watcom sont aussi supportés.

Qt va bien au-delà de l’IDE car il propose aussi une framework pour construire des interfaces graphiques utilisant le même code source sur toutes les plates-formes, y compris Android et iOS. MinGW/gcc et MVSC sont supportés

Eclipse est écrit en java donc plus lourd et plus lent que les IDE natifs. Eclipse est plus un atelier de génie logiciel qu'un simple IDE. Il fonctionne avec de (très) nombreux plugins et supporte ainsi plusieurs langages:  java, C/C++, PHP, SQL ... Le module CDT supporte plusieurs compilateurs dont MinGW/gcc et cygwin/gcc.