<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
	<title>/dev/log - Tag wxwidget</title>
	<link>http://benjaminbillet.fr/blog/index.php?tag/wxwidget</link>
	<language>fr</language>
	<description>Blog technique de Benjamin Billet</description>
<atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://benjaminbillet.fr/blog/feed.php?rss" />
	<lastBuildDate>Tue, 02 Jun 2015 22:09:00 +0200</lastBuildDate>
	<generator>PluXml</generator>
	<item>
		<title>Résoudre le conflit entre wxMSW (wxWidget) et libjpeg</title> 
		<link>http://benjaminbillet.fr/blog/index.php?article4/resoudre-le-conflit-entre-wxwidget-et-libjpeg</link>
		<guid>http://benjaminbillet.fr/blog/index.php?article4/resoudre-le-conflit-entre-wxwidget-et-libjpeg</guid>
		<description>&lt;p&gt;CImg et wxWidget entrent en conflit car CImg importe les entêtes de libjpeg et wxMSW importe les entêtes de l&#039;API WIN32 qui, toutes deux, définissent le type &lt;em&gt;boolean&lt;/em&gt; :&lt;/p&gt;
&lt;pre&gt;
/usr/include/jmorecfg.h:234:13: error: conflicting declaration &#039;typedef int boolean&#039;
 typedef int boolean;
             ^
...
/usr/include/w32api/rpcndr.h:65:25: note: previous declaration as &#039;typedef unsigned char boolean&#039;
   typedef unsigned char boolean;
                         ^
&lt;/pre&gt;

&lt;p&gt;libjpeg prévoit cette éventualité et permet d&#039;éviter la déclaration de &lt;em&gt;typedef int boolean&lt;/em&gt; en définissant la constante &lt;em&gt;HAVE_BOOLEAN&lt;/em&gt;. Toutefois, si cette constante est définie, libjpeg ne fonctionne plus correctement, provoquant une erreur dans CImg :&lt;/p&gt;
&lt;pre&gt;
[CImg] *** CImgIOException *** [instance(0,0,0,0,0x0,non-shared)] CImg&lt;unsigned char&gt;::load(): Failed to recognize format of file &#039;images\IMG_6225.jpg&#039;.
&lt;/pre&gt;

&lt;p&gt;Je n&#039;ai, pour le moment, pas trouvé de solution satisfaisante à ce problème, hormis modifier le fichier &lt;em&gt;rpcndr.h&lt;/em&gt; de façon à changer la déclaration du type boolean :&lt;/p&gt;
[C99]
typedef unsigned char boolean;
// devient
typedef int boolean;
[/C99]

&lt;p&gt;Ce changement entraîne un problème dans &lt;em&gt;wtypesbase.h&lt;/em&gt;, qui doit lui aussi être modifié pour commenter la déclaration de &lt;em&gt;BOOLEAN&lt;/em&gt; : &lt;/p&gt;
[C99]
// la ligne doit être commentée
typedef boolean BOOLEAN;
[/C99]

Si vous connaissez quelque chose de mieux, merci de m&#039;envoyer un mail et je l&#039;ajouterais ici.</description>
		<pubDate>Tue, 02 Jun 2015 22:09:00 +0200</pubDate>
		<dc:creator>Benjamin Billet</dc:creator>
	</item>
	<item>
		<title>wxWidget : résoudre l&#039;erreur de compilation &quot;undefined reference to `_IID_IPersistFile&#039;&quot;, &quot;undefined reference to `glFrustum&#039;&quot;, etc.</title> 
		<link>http://benjaminbillet.fr/blog/index.php?article6/resoudre-l-erreur-de-compilation-emsrc-common-filename-cpp-1602-undefined-reference-to-iid-ipersistfile-em</link>
		<guid>http://benjaminbillet.fr/blog/index.php?article6/resoudre-l-erreur-de-compilation-emsrc-common-filename-cpp-1602-undefined-reference-to-iid-ipersistfile-em</guid>
		<description>Lors de la compilation de wxWidgets (ici 3.0.2), il peut arriver que la compilation échoue sur l&#039;erreur suivante :
&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;
g++ -shared -o /home/win7/wxWidgets-3.0.2/lib/cygwxbase30u_gcc_custom-0.dll basedll_version_rc.o basedll_any.o basedll_appbase.o basedll_arcall.o basedll_arcfind.o basedll_archive.o basedll_arrstr.o basedll_base64.o basedll_clntdata.o basedll_cmdline.o basedll_config.o basedll_convauto.o basedll_datetime.o basedll_datetimefmt.o basedll_datstrm.o basedll_dircmn.o basedll_dynarray.o basedll_dynlib.o basedll_dynload.o basedll_encconv.o basedll_evtloopcmn.o basedll_extended.o basedll_ffile.o basedll_file.o basedll_fileback.o basedll_fileconf.o basedll_filefn.o basedll_filename.o basedll_filesys.o basedll_filtall.o basedll_filtfind.o basedll_fmapbase.o basedll_fs_arc.o basedll_fs_filter.o basedll_hash.o basedll_hashmap.o basedll_init.o basedll_intl.o basedll_ipcbase.o basedll_languageinfo.o basedll_list.o basedll_log.o basedll_longlong.o basedll_memory.o basedll_mimecmn.o basedll_module.o basedll_mstream.o basedll_numformatter.o basedll_object.o basedll_platinfo.o basedll_powercmn.o basedll_process.o basedll_regex.o basedll_stdpbase.o basedll_sstream.o basedll_stdstream.o basedll_stopwatch.o basedll_strconv.o basedll_stream.o basedll_string.o basedll_stringimpl.o basedll_stringops.o basedll_strvararg.o basedll_sysopt.o basedll_tarstrm.o basedll_textbuf.o basedll_textfile.o basedll_threadinfo.o basedll_common_time.o basedll_timercmn.o basedll_timerimpl.o basedll_tokenzr.o basedll_translation.o basedll_txtstrm.o basedll_unichar.o basedll_uri.o basedll_ustring.o basedll_variant.o basedll_wfstream.o basedll_wxcrt.o basedll_wxprintf.o basedll_xlocale.o basedll_xti.o basedll_xtistrm.o basedll_zipstrm.o basedll_zstream.o basedll_fswatchercmn.o basedll_fswatcherg.o basedll_basemsw.o basedll_crashrpt.o basedll_debughlp.o basedll_dde.o basedll_msw_dir.o basedll_dlmsw.o basedll_evtloopconsole.o basedll_msw_mimetype.o basedll_power.o basedll_regconf.o basedll_registry.o basedll_msw_snglinst.o basedll_msw_stackwalk.o basedll_msw_stdpaths.o basedll_msw_thread.o basedll_timer.o basedll_msw_utils.o basedll_msw_utilsexc.o basedll_fswatcher.o  basedll_event.o basedll_fs_mem.o basedll_msgout.o basedll_utilscmn.o basedll_main.o basedll_mslu.o basedll_volume.o     -L/home/win7/wxWidgets-3.0.2/lib  -Wl,--out-implib=/home/win7/wxWidgets-3.0.2/lib/libwx_baseu-3.0.dll.a      -lwxregexu-3.0  -lz -lrpcrt4 -loleaut32 -lole32 -luuid -lwinspool -lwinmm -lshell32 -lcomctl32 -lcomdlg32 -ladvapi32 -lwsock32 -lgdi32 -lkernel32 -luser32  -lz -lrpcrt4 -loleaut32 -lole32 -luuid -lwinspool -lwinmm -lshell32 -lcomctl32 -lcomdlg32 -ladvapi32 -lwsock32 -lgdi32 -lkernel32 -luser32
basedll_filename.o:filename.cpp:(.text+0x511c): undefined reference to `IID_IShellLinkW&#039;
basedll_filename.o:filename.cpp:(.text+0x5162): undefined reference to `IID_IPersistFile&#039;
collect2: error: ld returned 1 exit status
Makefile:15531: recipe for target &#039;/home/win7/wxWidgets-3.0.2/lib/cygwxbase30u_gcc_custom-0.dll&#039; failed
make: *** [/home/win7/wxWidgets-3.0.2/lib/cygwxbase30u_gcc_custom-0.dll] Error 1
&lt;/pre&gt;

&lt;p&gt;Cette erreur se produit lorsque &lt;em&gt;libuuid-devel&lt;/em&gt; est installé, conduisant l&#039;option &lt;em&gt;-luuid&lt;/em&gt; à lier &lt;em&gt;/usr/lib/libuuid.a&lt;/em&gt; au lieu de &lt;em&gt;/usr/lib/w32api/libuuid.a&lt;/em&gt;. Pour résoudre ce problème, il est nécessaire d&#039;éditer le fichier Makefile et d&#039;ajouter &lt;em&gt;-L /usr/lib/w32api&lt;/em&gt; à la variable &lt;em&gt;LDFLAGS&lt;/em&gt;. Ainsi, ayant connaissance du répertoire approprié, g++ va lier la bonne librairie.&lt;/p&gt;

&lt;p&gt;Une fois ce problème résolu, une autre erreur survient un peu plus tard, indiquant notamment que des éléments d&#039;OpenGL sont manquants :&lt;/p&gt;
&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;
g++ -shared -o /home/win7/wxWidgets-3.0.2/lib/cygwxmsw30u_gl_gcc_custom-0.dll gldll_version_rc.o gldll_glcmn.o gldll_msw_glcanvas.o    -L/home/win7/wxWidgets-3.0.2/lib  -Wl,--out-implib=/home/win7/wxWidgets-3.0.2/lib/libwx_mswu_gl-3.0.dll.a   -L /usr/lib/w32api  -lwxtiff-3.0 -lwxjpeg-3.0 -lwxpng-3.0    -lwxregexu-3.0 -lwxexpat-3.0 -lz -lrpcrt4 -loleaut32 -lole32 -luuid -lwinspool -lwinmm -lshell32 -lcomctl32 -lcomdlg32 -ladvapi32 -lwsock32 -lgdi32 -lkernel32 -luser32  -lwx_mswu_core-3.0 -lwx_baseu-3.0  -lopengl32 -lglu32 -lz -lrpcrt4 -loleaut32 -lole32 -luuid -lwinspool -lwinmm -lshell32 -lcomctl32 -lcomdlg32 -ladvapi32 -lwsock32 -lgdi32 -lkernel32 -luser32
gldll_glcmn.o:glcmn.cpp:(.text+0x363): undefined reference to `glFrustum&#039;
gldll_glcmn.o:glcmn.cpp:(.text+0x428): undefined reference to `glGetBooleanv&#039;
gldll_glcmn.o:glcmn.cpp:(.text+0x91a): undefined reference to `glColor3f&#039;
gldll_glcmn.o:glcmn.cpp:(.text+0xae1): undefined reference to `glIndexi&#039;
gldll_glcmn.o:glcmn.cpp:(.text+0x371): undefined reference to `glBegin&#039;
gldll_glcmn.o:glcmn.cpp:(.text+0x381): undefined reference to `glTexCoord2f&#039;
gldll_glcmn.o:glcmn.cpp:(.text+0x391): undefined reference to `glVertex3f&#039;
gldll_glcmn.o:glcmn.cpp:(.text+0x3a1): undefined reference to `glNormal3f&#039;
gldll_glcmn.o:glcmn.cpp:(.text+0x3b1): undefined reference to `glColor4f&#039;
gldll_glcmn.o:glcmn.cpp:(.text+0x3c1): undefined reference to `glColor3f&#039;
gldll_glcmn.o:glcmn.cpp:(.text+0x3d1): undefined reference to `glEnd&#039;
collect2: error: ld returned 1 exit status
Makefile:16086: recipe for target &#039;/home/win7/wxWidgets-3.0.2/lib/cygwxmsw30u_gl_gcc_custom-0.dll&#039; failed
make: *** [/home/win7/wxWidgets-3.0.2/lib/cygwxmsw30u_gl_gcc_custom-0.dll] Error 1
&lt;/pre&gt;

&lt;p&gt;Il semble que le lien avec OpenGL ne soit pas fait et doive être ajouté. De la même façon que le problème précédent, il est nécessaire d&#039;aller modifier le fichier Makefile. Il suffit de trouver la variable &lt;em&gt;EXTRALIBS_OPENGL&lt;/em&gt; et d&#039;y ajouter &lt;em&gt;-lGl&lt;/em&gt;.</description>
		<pubDate>Thu, 28 May 2015 21:00:00 +0200</pubDate>
		<dc:creator>Benjamin Billet</dc:creator>
	</item>
	<item>
		<title>Compiler wxWidget 3.0.2 avec cygwin 2.0.0 sous windows</title> 
		<link>http://benjaminbillet.fr/blog/index.php?article3/compiler-wxwidget-avec-cygwin</link>
		<guid>http://benjaminbillet.fr/blog/index.php?article3/compiler-wxwidget-avec-cygwin</guid>
		<description>&lt;p&gt;En premier lieu, il est nécessaire d&#039;installer &lt;a href=&quot;https://cygwin.com&quot;&gt;cygwin&lt;/a&gt; (2.0.0) avec les paquets suivants : automake, autoconf, make, gcc-g++.&lt;/p&gt;

&lt;p&gt;Concrètement, &lt;a href=&quot;http://www.wxwidgets.org&quot;&gt;wxWidgets&lt;/a&gt; spécifie un ensemble d&#039;API communes, qui sont implémentées sur &lt;a href=&quot;http://docs.wxwidgets.org/3.0.2/page_port.html&quot;&gt;différentes plateformes&lt;/a&gt;.
Pour windows, nous allons compiler &lt;a href=&quot;http://docs.wxwidgets.org/3.0.2/page_port.html#page_port_wxmsw&quot;&gt;wxMSW&lt;/a&gt; mais nous pourrions aussi utiliser &lt;a href=&quot;http://docs.wxwidgets.org/3.0.2/page_port.html#page_port_wxx11&quot;&gt;wxX11&lt;/a&gt; ou &lt;a href=&quot;http://docs.wxwidgets.org/3.0.2/page_port.html#page_port_wxgtk&quot;&gt;wxGTK&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Après s&#039;être placé dans le dossier des sources de wxWidgets-3.0.2 avec la console cygwin, la configuration/compilation est classique :&lt;/p&gt;
&lt;pre&gt;
$&gt; ./configure --with-msw --enable-unicode
$&gt; make
$&gt; make install
&lt;/pre&gt;
&lt;p&gt;Par défaut la compilation construit des librairies dynamiques, les librairies statiques pouvant être générées avec l&#039;option &lt;em&gt;--disable-shared&lt;/em&gt;. De nombreuses options sont disponibles pour le ./configure, la liste complète pouvant être obtenue avec :&lt;/p&gt;
&lt;pre&gt;
$&gt; ./configure --help
&lt;/pre&gt;
&lt;p&gt;A noter que wxWidgets est directement fourni avec le code source de ses dépendances, la configuration permettant de préciser s&#039;il est préférable d&#039;utiliser les versions fournies (p. ex. &lt;em&gt;--with-jpeg=builtin&lt;/em&gt;) ou les librairies éventuellement installées sur le système (p. ex. &lt;em&gt;--with-jpeg=sys&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Une fois l&#039;installation terminée, la commande suivante devrait être disponible :&lt;/p&gt;
&lt;pre&gt;
$&gt; wx-config --version
3.0.2
&lt;/pre&gt;

&lt;p&gt;Pour un test plus poussé, il est possible de compiler les exemples fournis dans le dossier &quot;samples&quot; :&lt;/p&gt;
&lt;pre&gt;
$&gt; cd samples/treelist
$&gt; make
&lt;/pre&gt;

&lt;p&gt;Après avoir intégré les dll de wxWidgets, disponibles dans &lt;em&gt;wxWidgets-3.0.2/lib&lt;/em&gt;, et celles de cygwin (&lt;em&gt;/bin&lt;/em&gt;), l&#039;exécutable treelist.exe devrait s&#039;afficher ainsi :&lt;/p&gt;

&lt;a href=&quot;http://benjaminbillet.fr/blog/data/images/wxwidget-treelist-screenshot.png&quot;&gt;&lt;img src=&quot;http://benjaminbillet.fr/blog/data/images/wxwidget-treelist-screenshot.png&quot; alt=&quot;treelist-screen&quot; /&gt;&lt;/a&gt;

&lt;h2&gt;Environnement&lt;/h2&gt;
&lt;p&gt;J&#039;utilise Eclipse IDE for C/C++ pour gérer le projet mais, globalement, les informations suivantes s&#039;appliquent à tout projet basé sur wxWidget. Le type de projet C/C++ crée est un &lt;em&gt;Makefile project&lt;/em&gt; vide. Pour assurer que toutes les options de configurations soient disponibles (constantes, flags, includes, libs, etc.), il faut en outre activer la génération automatique du makefile (options du projet -&gt; C/C++ Build).&lt;br/&gt;
&lt;ins&gt;Remarque&lt;/ins&gt; : pour une détection de Cygwin par Eclipse, il suffit d&#039;ajouter simplement le dossier &lt;em&gt;chemin/vers/cygwin/bin&lt;/em&gt; au PATH de windows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C++ Compiler&lt;/strong&gt; &amp;emsp; Concrètement, la commande &lt;em&gt;wx-config&lt;/em&gt; génère les paramètres cohérents pour g++ :&lt;/p&gt;
&lt;pre&gt;
$&gt; wx-config --static=no --cxxflags --linkdeps
-I/usr/local/lib/wx/include/msw-unicode-3.0 -I/usr/local/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXMSW__ 
&lt;/pre&gt;
&lt;p&gt;Aussi, la configuration d&#039;Eclipse se fait simplement en ajoutant &lt;em&gt;`/usr/local/bin/wx-config --static=no --cxxflags --linkdeps`&lt;/em&gt; à la commande g++ (adapter le chemin si nécessaire). &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C++ Linker&lt;/strong&gt; &amp;emsp; Ici, il est nécessaire de changer le &lt;em&gt;Command Line Pattern&lt;/em&gt; en déplaçant le bloc FLAGS à la fin :
&lt;pre&gt;
${COMMAND} ${FLAGS} ${OUTPUT_FLAG}${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}
devient
${COMMAND} ${OUTPUT_FLAG}${OUTPUT_PREFIX}${OUTPUT} ${INPUTS} ${FLAGS}
&lt;/pre&gt;
En effet, nous utilisons les flags pour qu&#039;Eclipse construise le makefile avec la commande &lt;em&gt;wx-config&lt;/em&gt; à la fin de la commande g++. Pour ce faire, dans &lt;em&gt;Miscellaneous&lt;/em&gt;, nous spécifions &lt;em&gt;`/usr/local/bin/wx-config --libs --static=no`&lt;/em&gt; dans le champ &lt;em&gt;Linker flags&lt;/em&gt;. En outre les paramètres suivants peuvent être ajoutés à ce champ : &lt;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;-mwindows&lt;/em&gt; : ne pas afficher de console à l&#039;ouverture de l&#039;application&lt;/li&gt;
&lt;li&gt;&lt;em&gt;-Wl,--enable-auto-import&lt;/em&gt; n&#039;est pas toujours nécessaire car activé par défaut dans cygwin : &lt;a href=&quot;https://sourceware.org/binutils/docs-2.17/ld/WIN32.html&quot;&gt;https://sourceware.org/binutils/docs-2.17/ld/WIN32.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Utiliser &lt;em&gt;windres&lt;/em&gt; pour avoir un rendu visuel conforme à Window&lt;/h2&gt;
&lt;p&gt;Si l&#039;on crée un nouveau projet vierge à partir des fichiers &lt;em&gt;treelist.cpp&lt;/em&gt; et &lt;em&gt;treelist.h&lt;/em&gt; fourni dans l&#039;exemple &lt;/em&gt;samples/treelist&lt;/em&gt; et que l&#039;on compile, l&#039;application s&#039;affiche comme suit :&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://benjaminbillet.fr/blog/data/images/wxwidget-treelist-screenshot2.png&quot;&gt;&lt;img src=&quot;http://benjaminbillet.fr/blog/data/images/wxwidget-treelist-screenshot2.png&quot; alt=&quot;treelist-screen&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contrairement à la première capture, les composants graphiques s&#039;affichent ici comme si l&#039;application était exécutée sous Windows 95. Pour résoudre ce problème, il est nécessaire de créer un fichier de ressource (voir &lt;a href=&quot;http://fr.wikipedia.org/wiki/Ressources_%28Windows%29&quot;&gt;Ressource Windows&lt;/a&gt;), de le &quot;compiler&quot; avec &lt;a href=&quot;https://sourceware.org/binutils/docs/binutils/windres.html&quot;&gt;windres&lt;/a&gt; (fourni avec wxWidgets) et de linker la ressource compilée à notre projet.&lt;/p&gt;

&lt;p&gt;wxWidgets fournit un fichier de ressource basique, &lt;em&gt;samples/sample.rc&lt;/em&gt; :&lt;/p&gt;
[C99]
/////////////////////////////////////////////////////////////////////////////
// Name:        samples/samples.rc
// Purpose:     a standard Win32 .rc file for the wxWindows samples
// Author:      Vadim Zeitlin
// Modified by:
// Created:     04.08.03
// Copyright:   (c) 2003 Vadim Zeitlin &lt;vadim@wxwindows.org&gt;
// Licence:     wxWindows licence
/////////////////////////////////////////////////////////////////////////////

// this minimal resource file is all what is needed for most of the wxWindows
// samples

// note that the icon used by the Explorer (i.e. the programs icon) is the
// first icon in the executable and the icons are sorted both by their order
// (Win9x) and by alphabetically (!) (NT), so put this icon first and give it
// a name starting with &quot;a&quot;
aaaaaaaa ICON &quot;sample.ico&quot;

// this icon is used with wxFrame::SetIcon()
sample ICON &quot;sample.ico&quot;

// set this to 1 if you don&#039;t want to use manifest resource (manifest resource
// is needed to enable visual styles on Windows XP - see docs/msw/winxp.txt
// for more information)
#define wxUSE_NO_MANIFEST 0

// this is not always needed but doesn&#039;t hurt (except making the executable
// very slightly larger): this file contains the standard icons, cursors, ...
#include &quot;wx/msw/wx.rc&quot;
[/C99]

&lt;p&gt;Ce fichier doit être ajouté aux sources du projet Eclipse et sa compilation par windres est spécifiée dans les &lt;em&gt;Pre Build Steps&lt;/em&gt; du projet. Il est nécessaire de préciser explicitement le chemin vers les headers de wxWidgets ainsi que le chemin vers le fichier ressource (ici, my_resource_file.rc) : &lt;em&gt;windres -i&quot;../src/my_resource_file.rc&quot; -omy_resource_file_rc.o -I&quot;/usr/local/include/wx-3.0&quot;&lt;/em&gt;.
Enfin, dans la configuration du &lt;em&gt;C++ Linker&lt;/em&gt;, nous ajoutons &lt;em&gt;my_resource_file_rc.o&lt;/em&gt; à la liste &lt;em&gt;Other Objects&lt;/em&gt; de &lt;em&gt;Miscellaneous&lt;/em&gt;.&lt;/p&gt;</description>
		<pubDate>Tue, 26 May 2015 21:01:00 +0200</pubDate>
		<dc:creator>Benjamin Billet</dc:creator>
	</item>
</channel>
</rss>