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.
15 juillet 2014
Boost + MinGW (Qt, CodeBlock)
Ce n’est malheureusement pas nouveau mais compiler les librairies de Boost sous Windows sans utiliser Visual Studio C++ mais en utilisant MinGW/gcc est une véritable galère !
- Il faut absolument MASM, l’assembleur de Microsoft . (celui de gcc n’est pas supporté)
- Il y a 2 bugs dans la batch build.bat qui compile bjam (le ‘make’ de Boost)
- La procédure d’installation/compilation est mal conçue et il faut éditer manuellement des fichiers de configuration.
Nous allons voir comment corriger tout cela...
PREREQUIS
Ce qui suit a été testé avec Boost 1.55 + win7 64bits
PREMIER BUG de tools\build\v2\engine\build.bat.
Le programme d’installation de Boost s’attend à trouver MinGW dans C:\MinGW mais si vous l’avez installé ailleurs, ou utilisez le MinGW de Qt ou CodeBlock ça ne marchera pas.Voici comment corriger cela.
Dans le fichier tools\build\v2\engine\build.bat remplacer (ou mettre en commentaire avec REM) les 4 lignes :
Pourquoi chercher mingw32-make.exe et non gcc.exe dans le PATH ?
- Si on cherche gcc.exe on risque de trouver une installation de gcc qui n’appartient à MinGW mais à cygwin.
- Si on cherche mingw32-gcc.exe on ne trouvera pas gcc si c’est la version 64 bits qui est installée car son nom est i686-w64-mingw32-gcc.exe
- Réciproquement, si on cherche i686-w64-mingw32-gcc.exe on ne trouvera pas la version 32 bits.
Par contre si on cherche et trouve mingw32-make.exe on est certain qu’avec lui il y a une version de gcc (32 ou 64 bits) appartenant à MinGW.
DEUXIEME BUG de tools\build\v2\engine\build.bat
Ce bug a pour effet de détecter la présence du compilateur de Microsoft MSVC même quand il n’est pas installé. La cause de ce bug est que pour certaines versions de Windows la commande
set test=%~$PATH:1
met à jour le errorlevel et pour d’autres non. Ce bug est par exemple présent pour WIN7 64 bits.
Dans la fonction :Test_path, avant la ligne ‘endlocal’ il faut ajouter cette ligne
if not defined test ( call :Set_Error ) else ( call :Clear_Error )
Ce qui donne :
:Test_Path
REM Tests for the given file(executable) presence in the directories in the PATH
REM environment variable. Additionaly sets FOUND_PATH to the path of the
REM found file.
call :Clear_Error
setlocal
set test=%~$PATH:1
if not defined test ( call :Set_Error ) else ( call :Clear_Error )
endlocal
if not errorlevel 1 set FOUND_PATH=%~dp$PATH:1
goto :eof
TROISIÈME BUG
Une fois ces deux premier bugs corrigés, on peut ouvrir une ligne de commande (cmd) dans la racine des sources de Boost et taper :
bootstrap.bat
Ensuite NE PAS TAPER b2 comme indiqué à l’écran !
Il faut au préalable éditer le fichier project-config.jam et remplacer msvc par mingw.
La raison de ce travail supplémentaire est expliqué dans les commentaires du fichier bootstrap.bat :
Après avoir modifiè project-config.jam vous pouvez exécuter « b2 »
TRUC:
Utilisez "b2 -j 4" pour utiliser 4 theads de compilation, ou plus si votre processeur le supporte.
Pour tout effacer b2 --clean
Plus d'info sur les paramètres de b2...
Après un temps plus ou moins long (de 10 à 50 min) suivant la vitesse cpu et disque de votre machine et le nombre de threads mis en jeux vous obtiendrez :
Bravo !
Boost 1.55 et MSVC 2013 (Quatrième bug)
En compilant Boost 1.55 avec Microsoft Visual Studio Express 2013 (donc version 12) on a cette erreur de compilation:
transform_width.hpp(151) : error C2039: 'min' : is not a member of 'std'
transform_width.hpp(151) : error C3861: 'min': identifier not found
Pour la corriger il faut ajouter cette simple ligne:
Il n’y a donc pas que GCC qui est mal testé par les développeurs de Boost !
NB: Je n'utilise Boost que quand c'est imposé car, depuis toujours, c'est la galère.
- Il faut absolument MASM, l’assembleur de Microsoft . (celui de gcc n’est pas supporté)
- Il y a 2 bugs dans la batch build.bat qui compile bjam (le ‘make’ de Boost)
- La procédure d’installation/compilation est mal conçue et il faut éditer manuellement des fichiers de configuration.
Nous allons voir comment corriger tout cela...
PREREQUIS
- MASM est installé. Voir absolument ce post pour éviter de devoir installer MSVC avec MASM.
MASM doit être dans le PATH. - MinGW est installé, soit directement soit via un outil tel que Qt ou Code::Blocks.
Quelle que soit l’origine de MinGW il faut obligatoirement ajouter au PATH le répertoire ’bin’ de MinGW - Télécharger les sources des librairies Boost.
Ce qui suit a été testé avec Boost 1.55 + win7 64bits
PREMIER BUG de tools\build\v2\engine\build.bat.
Le programme d’installation de Boost s’attend à trouver MinGW dans C:\MinGW mais si vous l’avez installé ailleurs, ou utilisez le MinGW de Qt ou CodeBlock ça ne marchera pas.Voici comment corriger cela.
Dans le fichier tools\build\v2\engine\build.bat remplacer (ou mettre en commentaire avec REM) les 4 lignes :
if EXIST "C:\MinGW\bin\gcc.exe" (Par ces 5 lignes:
set "BOOST_JAM_TOOLSET=mingw"
set "BOOST_JAM_TOOLSET_ROOT=C:\MinGW\"
goto :eof)
call :Test_Path mingw32-make.exe
if not errorlevel 1 (
set "BOOST_JAM_TOOLSET=mingw"
set "BOOST_JAM_TOOLSET_ROOT=%FOUND_PATH%..\"
goto :eof)
Pourquoi chercher mingw32-make.exe et non gcc.exe dans le PATH ?
- Si on cherche gcc.exe on risque de trouver une installation de gcc qui n’appartient à MinGW mais à cygwin.
- Si on cherche mingw32-gcc.exe on ne trouvera pas gcc si c’est la version 64 bits qui est installée car son nom est i686-w64-mingw32-gcc.exe
- Réciproquement, si on cherche i686-w64-mingw32-gcc.exe on ne trouvera pas la version 32 bits.
Par contre si on cherche et trouve mingw32-make.exe on est certain qu’avec lui il y a une version de gcc (32 ou 64 bits) appartenant à MinGW.
DEUXIEME BUG de tools\build\v2\engine\build.bat
Ce bug a pour effet de détecter la présence du compilateur de Microsoft MSVC même quand il n’est pas installé. La cause de ce bug est que pour certaines versions de Windows la commande
set test=%~$PATH:1
met à jour le errorlevel et pour d’autres non. Ce bug est par exemple présent pour WIN7 64 bits.
Dans la fonction :Test_path, avant la ligne ‘endlocal’ il faut ajouter cette ligne
if not defined test ( call :Set_Error ) else ( call :Clear_Error )
Ce qui donne :
:Test_Path
REM Tests for the given file(executable) presence in the directories in the PATH
REM environment variable. Additionaly sets FOUND_PATH to the path of the
REM found file.
call :Clear_Error
setlocal
set test=%~$PATH:1
if not defined test ( call :Set_Error ) else ( call :Clear_Error )
endlocal
if not errorlevel 1 set FOUND_PATH=%~dp$PATH:1
goto :eof
TROISIÈME BUG
Une fois ces deux premier bugs corrigés, on peut ouvrir une ligne de commande (cmd) dans la racine des sources de Boost et taper :
bootstrap.bat
Ensuite NE PAS TAPER b2 comme indiqué à l’écran !
Il faut au préalable éditer le fichier project-config.jam et remplacer msvc par mingw.
La raison de ce travail supplémentaire est expliqué dans les commentaires du fichier bootstrap.bat :
REM Ideally, we should obtain the toolset that build.bat hasIncroyable, n’est-ce pas, qu’après tant d’années personne n’ai trouvé de solution...
REM guessed. However, it uses setlocal at the start and does
REM export BOOST_JAM_TOOLSET, and I don't know how to do that
REM properly. Default to msvc for now.
set toolset=msvc
Après avoir modifiè project-config.jam vous pouvez exécuter « b2 »
TRUC:
Utilisez "b2 -j 4" pour utiliser 4 theads de compilation, ou plus si votre processeur le supporte.
Pour tout effacer b2 --clean
Plus d'info sur les paramètres de b2...
Après un temps plus ou moins long (de 10 à 50 min) suivant la vitesse cpu et disque de votre machine et le nombre de threads mis en jeux vous obtiendrez :
The Boost C++ Libraries were successfully built!
The following directory should be added to compiler include paths:
C:/xyz/boost_1_55_0
The following directory should be added to linker library paths:
C:\xyz\boost_1_55_0\stage\lib
(xyz depend de là où vous avez décompressé Boost)
Bravo !
Boost 1.55 et MSVC 2013 (Quatrième bug)
En compilant Boost 1.55 avec Microsoft Visual Studio Express 2013 (donc version 12) on a cette erreur de compilation:
transform_width.hpp(151) : error C2039: 'min' : is not a member of 'std'
transform_width.hpp(151) : error C3861: 'min': identifier not found
Pour la corriger il faut ajouter cette simple ligne:
#include <algorithm>au début de boost/archive/iterators/transform_width.hpp
Il n’y a donc pas que GCC qui est mal testé par les développeurs de Boost !
NB: Je n'utilise Boost que quand c'est imposé car, depuis toujours, c'est la galère.
MASM pour Boost et MinGW
Certaines librairies de Boost contiennent du code écrit en assembleur. Contrairement à C++ qui utilise la même syntaxe quel que soit le système (Linux, Mac, Sun, Windows) l’assembleur n’est pas standardisé. Bien que le processeur soit le même, le même le code ne s’écrit pas de la même façon sous Linux ou Windows parce que l’assembleur par défaut de ces plateformes n’est pas le même.
L'assembleur inclus avec gcc est 'as'. Il est présent sous Windows et Linux mais les mainteneurs de Boost refusent d’avoir deux versions du même code pour la même plateforme. Hors de question pour eux d’avoir une version pour 'MASM' de Microsoft et une autre version pour 'as' de GNU. Pour Windows la seule version disponible est celle pour MASM.
Donc, si vous voulez utiliser la suite gcc de MinGW pour compiler les librairies de Boost il vous faudra malgré tout MASM de Microsoft et, en théorie, une version anglaise de Visual Studio C++ Express Edition. En effet à l’installation de MASM requiert MSVS C++ Express.
En soit rien de grave car les deux produits sont librement et gratuitement téléchargeables chez Microsoft.
- MASM : http://www.microsoft.com/en-us/download/details.aspx?id=12654
- MSVC Express : http://www.visualstudio.com/en-us/downloads/download-visual-studio-vs
Voici donc comment installer MASM sans MSVC Express.
Pour cette manipulation on utilisera 7zip : http://www.7-zip.org/
- Télécharger MASMsetup.EXE chez Microsoft
http://www.microsoft.com/en-us/download/details.aspx?id=12654.
- Bouton droit sur le fichier qui vient d’être téléchargé,
dans le sous menu 7-Zip sélectionner « open archive ».
Ceci ouvrira 7-Zip et vous montrera le contenu du fichier MASMsetup.EXE c’est-à-dire le fichier setup.exe.

- Bouton droit sur ‘setup.exe’ puis choisir l’option « Open Inside ».
Le nom des deux fichier inclus dans setup.exe vont s'afficher.
- Bouton droit sur « vc_masm1.cab » puis à nouveau choisir « Open Inside ».

- Un nom de fichier ‘compliqué’ va apparaitre.

- Faire glisser ce fichier sur le bureau et le renommer « ml.exe »
- Déplacer ml.exe dans un répertoire présent dans le PATH ou créez en un pour l’occasion.
- Pour vérifier que tout est ok, ouvrir une ligne de commande (cmd) et taper « ml ». Vous devez obtenir la version du Macro Assembler .
27 novembre 2013
Mozilla Plugins registry
Les plugins de Firefox ne sont pas stockés dans un répertoire spécifique mais chaque plugins ajoute des entrées dans la registry pour indiquer où se trouve la dll à charger, pour quels mime-types il doit être invoqué ect. Il est est facile d'ajouter un plugins sans que l'utilisateur de Firefox s'en rende compte.
Des applications très honnêtes font cela (VLC, Adobe, Java ect).D'autres applications font cela en douce comme Google Chrome ou Microsoft...
Malheureusement on ne peut que désactiver un plugins. Pour qu'il ne figure plus dans la liste des plugins il faut supprimer ses entrées de la registry. Pour cela il faut lancer regedit et chercher toutes les clefs "MozillaPlugins" et supprimer les entrées correspondant aux plugins indésirables dans chacune de ces entrées:
HKEY_CURRENT_USER\Software\MozillaPlugins
HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MozillaPlugins (64bits)
Note: Supprimer la clef ne supprime aucun fichier du disque.
Une bonne habitude est de régulièrement visiter: http://www.mozilla.org/en-US/plugincheck/
Une bonne habitude est de régulièrement visiter: http://www.mozilla.org/en-US/plugincheck/


