[{"data":1,"prerenderedAt":3954},["ShallowReactive",2],{"post-nouvelles-fonctionnalites-de-qt-designer-45":3,"related-nouvelles-fonctionnalites-de-qt-designer-45":199},{"id":4,"title":5,"author":6,"body":7,"category":168,"categorySlug":169,"date":170,"description":171,"excerpt":172,"extension":187,"location":188,"meta":189,"navigation":190,"path":191,"published":190,"seo":192,"slug":193,"stem":194,"tags":195,"timeToRead":197,"__hash__":198},"posts\u002Fposts\u002FLogiciels\u002F2008-10-19-nouvelles-fonctionnalites-de-qt-designer-45.md","Nouvelles fonctionnalités de Qt Designer 4.5","Ulrich Vandenhekke",{"type":8,"value":9,"toc":164},"minimark",[10,36,39,46,52,55,61,64,109,115,118,124,127,133],[11,12,13,14,22,23,35],"p",{},"Sur ",[15,16,17,21],"em",{},[18,19,20],"strike",{},"Trolltech","Nokia Labs Blogs",", Friedelann Kleint nous\nprésente aujourd'hui les nouvelles fonctionnalités de Qt Designer 4.5",[24,25,26],"sup",{},[27,28,34],"a",{"href":29,"ariaDescribedBy":30,"dataFootnoteRef":32,"id":33},"#user-content-fn-1",[31],"footnote-label","","user-content-fnref-1","1",".",[11,37,38],{},"Au menu, on peut trouver l'ajout de filtre sur l'éditeur de propriétés\nainsi que sur l'inspecteur d'objet (Ce qui peut permettre de\nsélectionner un composant et d'en modifier les propriétés plus\nrapidement).",[11,40,41],{},[42,43],"img",{"alt":44,"src":45},"objectinspector","\u002FLogiciels\u002Fnouvelles-fonctionnalites-de-qt-designer-45\u002Fobjectinspector.png",[11,47,48],{},[42,49],{"alt":50,"src":51},"propertyeditorfilter","\u002FLogiciels\u002Fnouvelles-fonctionnalites-de-qt-designer-45\u002Fpropertyeditorfilter.png",[11,53,54],{},"L'arrangement de la boite à outil est également différent :",[11,56,57],{},[42,58],{"alt":59,"src":60},"widgetbox_iconmode","\u002FLogiciels\u002Fnouvelles-fonctionnalites-de-qt-designer-45\u002Fwidgetbox_iconmode.png",[11,62,63],{},"De plus il est maintenant possible de :",[65,66,67,79,89,96,103,106],"ul",{},[68,69,70,71,74,75,78],"li",{},"Sélectionner l'objet ancêtre d'un ",[15,72,73],{},"widget"," en sélectionnant ",[15,76,77],{},"Select\nancestors"," du menu contextuel.",[68,80,81,82,85,86,88],{},"Changer le ",[15,83,84],{},"Layout"," sans casser et reconstruire le ",[15,87,84],{}," de la\nfeuille",[68,90,91,92,95],{},"Ajouter facilement une nouvelle ligne au layout (L'action ",[15,93,94],{},"Add form\nlayout row"," ouvrant la boite de dialogue ci-dessous)",[68,97,98,99,102],{},"Créer des Assistants (",[15,100,101],{},"Wizard",") linéaires",[68,104,105],{},"Désactiver la traduction de certaine chaîne.",[68,107,108],{},"...",[11,110,111],{},[42,112],{"alt":113,"src":114},"formlayout","\u002FLogiciels\u002Fnouvelles-fonctionnalites-de-qt-designer-45\u002Fformlayout.png",[11,116,117],{},"Enfin, pour terminer, comme le dit Friedemann",[119,120,121],"blockquote",{},[11,122,123],{},"The general focus of the 4.5 release is on stability and performance.",[11,125,126],{},"Soit : Le but principal de la version 4.5 est la stabilité et les\nperformances.",[11,128,129,130,35],{},"Pour plus de précision, je vous conseille d'aller voir la page d'origine\net\u002Fou de télécharger la ",[15,131,132],{},"snapshot",[134,135,138,144],"section",{"className":136,"dataFootnotes":32},[137],"footnotes",[139,140,143],"h2",{"className":141,"id":31},[142],"sr-only","Footnotes",[145,146,147],"ol",{},[68,148,150,151,156,157],{"id":149},"user-content-fn-1","Référence : ",[27,152,153],{"href":153,"rel":154},"http:\u002F\u002Flabs.trolltech.com\u002Fblogs\u002F2008\u002F10\u002F16\u002Fnew-features-of-qt-designer-45\u002F",[155],"nofollow"," ",[27,158,163],{"href":159,"ariaLabel":160,"className":161,"dataFootnoteBackref":32},"#user-content-fnref-1","Back to reference 1",[162],"data-footnote-backref","↩",{"title":32,"searchDepth":165,"depth":165,"links":166},2,[167],{"id":31,"depth":165,"text":143},"Logiciels","logiciels","2008-10-19","Sur TrolltechNokia Labs Blogs, Friedelann Kleint nous\nprésente aujourd'hui les nouvelles fonctionnalités de Qt Designer 4.51.",{"type":8,"value":173},[174,185],[11,175,13,176,22,180,35],{},[15,177,178,21],{},[18,179,20],{},[24,181,182],{},[27,183,34],{"href":29,"ariaDescribedBy":184,"dataFootnoteRef":32,"id":33},[31],[11,186,38],{},"md","Lille, France",{},true,"\u002Fpost\u002Fnouvelles-fonctionnalites-de-qt-designer-45",{"title":5,"description":171},"nouvelles-fonctionnalites-de-qt-designer-45","posts\u002FLogiciels\u002F2008-10-19-nouvelles-fonctionnalites-de-qt-designer-45",[196],"qt",1,"nm-5nCtyIY7ytRcB2NS0B1KwbYlYkEMuv_OrrHl_gZI",[200,1774,3669],{"id":201,"title":202,"author":6,"body":203,"category":1740,"categorySlug":1741,"date":1742,"description":32,"excerpt":1743,"extension":187,"location":188,"meta":1764,"navigation":190,"path":1765,"published":190,"seo":1766,"slug":1767,"stem":1768,"tags":1769,"timeToRead":583,"__hash__":1773},"posts\u002Fposts\u002FProgrammation\u002F2016-12-10-findsimilarity.md","FindSimilarity - Trouver les différences entre plusieurs vidéos",{"type":8,"value":204,"toc":1728},[205,210,213,216,219,222,227,234,238,241,244,285,288,340,344,347,361,367,375,378,387,390,393,396,839,843,846,855,858,861,887,890,1014,1017,1025,1040,1043,1046,1596,1606,1610,1613,1617,1620,1623,1629,1632,1636,1642,1652,1655,1672,1689,1693,1696,1702,1705,1711,1717,1721,1724],[206,207,209],"h3",{"id":208},"introduction","Introduction",[11,211,212],{},"Bonjour,",[11,214,215],{},"Je souhaite vous présenter une petite expérience que je viens d'écrire.",[11,217,218],{},"Cela fait plusieurs années que je souhaitais m'amuser sur la librairie OpenCV mais sans jamais en avoir eu l'utilité. J'ai profité d'avoir un peu de temps libre, pour écrire un petit\nprogramme dont le but est de comparer un ensemble de vidéos.",[11,220,221],{},"Le but est ensuite de dire si dans cet ensemble de vidéos, deux vidéos sont identiques, ou se ressemblent, ou sont trop éloignées.",[11,223,224],{},[15,225,226],{},"J'ai souhaité faire cette expérience par amusement, je n'ai donc pas passé beaucoup de temps sur la qualité du code écrit. Ce dernier aurait pu être mieux découpé, posséder des\ncommentaires, des tests unitaires, ... . Si vous voulez utiliser ce code pour un véritable usage production, n'hésitez pas à améliorer celui ci.",[11,228,229,230,35],{},"Vous pouvez trouver le code source de cette expérience à l'adresse suivante : ",[27,231,232],{"href":232,"rel":233},"https:\u002F\u002Fgogs.shadoware.org\u002FShadowareOrg\u002Ffind-similarity",[155],[206,235,237],{"id":236},"le-jeux-de-données","Le jeux de données",[11,239,240],{},"J'ai pris plusieurs films en DVD que je possède. Possédant un NAS, et une chromecast, j'encode ces DVD au format vidéo et je les y dépose. Malheureusement la qualité est dégradée\npar rapport au DVD.",[11,242,243],{},"Pour constituer le jeu de données, je prends ces films encodés, que je dépose dans un dossier. Je copie certains d'entre eux telquel",[245,246,250],"pre",{"className":247,"code":248,"language":249,"meta":32,"style":32},"language-bash shiki shiki-themes one-dark-pro","mkdir example\ncd example\ncp ..\u002Ffilm1.avi film1_copy.avi\n","bash",[251,252,253,265,273],"code",{"__ignoreMap":32},[254,255,257,261],"span",{"class":256,"line":197},"line",[254,258,260],{"class":259},"sVbv2","mkdir",[254,262,264],{"class":263},"subq3"," example\n",[254,266,267,271],{"class":256,"line":165},[254,268,270],{"class":269},"sjrmR","cd",[254,272,264],{"class":263},[254,274,276,279,282],{"class":256,"line":275},3,[254,277,278],{"class":259},"cp",[254,280,281],{"class":263}," ..\u002Ffilm1.avi",[254,283,284],{"class":263}," film1_copy.avi\n",[11,286,287],{},"J'encode certains de ces films avec une résolution différente :",[245,289,291],{"className":247,"code":290,"language":249,"meta":32,"style":32},"avconv -i film2.m4v  -preset veryslow -s 320x240 film2.320x240.m4v\navconv -i film2.m4v  -preset veryslow -s 640x480 film2.640x480.m4v\n",[251,292,293,320],{"__ignoreMap":32},[254,294,295,298,302,305,308,311,314,317],{"class":256,"line":197},[254,296,297],{"class":259},"avconv",[254,299,301],{"class":300},"sVC51"," -i",[254,303,304],{"class":263}," film2.m4v",[254,306,307],{"class":300},"  -preset",[254,309,310],{"class":263}," veryslow",[254,312,313],{"class":300}," -s",[254,315,316],{"class":263}," 320x240",[254,318,319],{"class":263}," film2.320x240.m4v\n",[254,321,322,324,326,328,330,332,334,337],{"class":256,"line":165},[254,323,297],{"class":259},[254,325,301],{"class":300},[254,327,304],{"class":263},[254,329,307],{"class":300},[254,331,310],{"class":263},[254,333,313],{"class":300},[254,335,336],{"class":263}," 640x480",[254,338,339],{"class":263}," film2.640x480.m4v\n",[206,341,343],{"id":342},"comment-fonctionne-la-comparaison","Comment fonctionne la comparaison",[11,345,346],{},"Avant de parler de la comparaison, parlons des fichiers que nous allons comparer. Le programme va se constituer une liste des fichiers à comparer et pour chaque fichier va lire\nles informations suivantes :",[65,348,349,352,355,358],{},[68,350,351],{},"la durée du film",[68,353,354],{},"la largeur",[68,356,357],{},"la hauteur",[68,359,360],{},"une miniature du film (utilisée pour comparer à l'oeil les vidéos)",[11,362,363,364,35],{},"Ensuite, une fois les méta-données récupérées, le programe se constitue une liste de paires de fichiers à comparer en sélectionnant les fichiers qui ont une durée identique à +\u002F- 5\nsecondes. Ce paramètre est modifiable au niveau de la constante ",[251,365,366],{},"DELTA_SEC",[11,368,369,370,35],{},"Enfin vient la comparaison pour laquelle je me suis simplement basé sur les exemples du site OpenCV que vous pouvez trouver dans la rubrique\n",[27,371,374],{"href":372,"rel":373},"http:\u002F\u002Fdocs.opencv.org\u002F2.4\u002Fdoc\u002Ftutorials\u002Fhighgui\u002Fvideo-input-psnr-ssim\u002Fvideo-input-psnr-ssim.html",[155],"Video Input with OpenCV and similarity measurement",[11,376,377],{},"J'ai utilisé l'algorithme PSNR (Peak signal-to-noise ratio) pour déterminer si les deux images de la vidéos sont plutôt proches ou éloignées. Cet algorithme calcul la distorsion\nentre deux images. Il est principalement utilisé pour quantifier la performance réalisée par un encodeur lors de la compression d'une vidéo. Une valeur entre 30 et 50 signifie que\nles images sont relativement proches. Plus la valeur est haute, et plus la qualité d'image est conservée entre les deux images. Si la valeur est inférieure à 30 on peut estimer qu'il\ny a une forte chance pour que les images soit différentes.",[11,379,380,381,386],{},"Vous pouvez retrouver les formules utilisées par le calcul sur le site d'OpenCV ou sur la page ",[27,382,385],{"href":383,"rel":384},"https:\u002F\u002Ffr.wikipedia.org\u002Fwiki\u002FPeak_Signal_to_Noise_Ratio",[155],"Wikipedia",". Est-ce que ce\ncalcul est le meilleur pour trouver les images similaires ? Je ne sais pas. Si vous avez d'autres propositions, on peut les tester.",[11,388,389],{},"Sur une vidéo on a une multitude d'images (sur un film d'une heure et demie à 25 images secondes, nous en avons 135 000), on pourrait comparer chaque image de la vidéo pour se faire\nune moyenne, de mon coté j'ai préféré comparer une image au milieu de la vidéo afin de parcourir plus vite les vidéos.",[11,391,392],{},"De la même manière pour m'abstraire de la taille de la vidéo qui peut avoir été modififée, je redimensionne, à tort ou à raison, les deux images à une taille identique\n(arbitrairement: 160x120).",[11,394,395],{},"Je vous présente donc ci-dessous l'algorithme que vous pouvez retrouver sur le site d'OpenCV. J'ai légèrement modifié l'algorithme pour redimensionner les images ainsi que pour\nretourner une valeur de PSNR infiniment grande quand deux vidéos sont identiques.",[245,397,401],{"className":398,"code":399,"language":400,"meta":32,"style":32},"language-cpp shiki shiki-themes one-dark-pro","double getPSNR(const cv::Mat& F1, const cv::Mat& F2) {\n    cv::Mat I1, I2;\n\n    cv::resize(F1, I1, cv::Size(160, 120));\n    cv::resize(F2, I2, cv::Size(160, 120));\n\n    cv::Mat s1;\n    cv::absdiff(I1, I2, s1);   \u002F\u002F |I1 - I2|\n    s1.convertTo(s1, CV_32F);  \u002F\u002F cannot make a square on 8 bits\n    s1 = s1.mul(s1);           \u002F\u002F |I1 - I2|^2\n\n    cv::Scalar s = sum(s1);    \u002F\u002F sum elements per channel\n\n    double sse = s.val[0] + s.val[1] + s.val[2]; \u002F\u002F sum channels\n\n    if( sse \u003C= 1e-10) {        \u002F\u002F for small values return zero\n        return std::numeric_limits\u003Cdouble>::infinity();\n    } else {\n        double mse  = sse \u002F (double)(I1.channels() * I1.total());\n        double psnr = 10.0 * log10((255 * 255) \u002F mse);\n        return psnr;\n    }\n","cpp",[251,402,403,450,455,460,488,510,515,521,536,553,576,581,597,602,665,670,700,726,738,787,825,833],{"__ignoreMap":32},[254,404,405,409,412,416,419,422,426,429,433,436,438,440,442,444,447],{"class":256,"line":197},[254,406,408],{"class":407},"seHd6","double",[254,410,411],{"class":259}," getPSNR",[254,413,415],{"class":414},"sn6KH","(",[254,417,418],{"class":407},"const",[254,420,421],{"class":414}," cv::",[254,423,425],{"class":424},"sU0A5","Mat",[254,427,428],{"class":407},"&",[254,430,432],{"class":431},"s_ZVi"," F1",[254,434,435],{"class":414},", ",[254,437,418],{"class":407},[254,439,421],{"class":414},[254,441,425],{"class":424},[254,443,428],{"class":407},[254,445,446],{"class":431}," F2",[254,448,449],{"class":414},") {\n",[254,451,452],{"class":256,"line":165},[254,453,454],{"class":414},"    cv::Mat I1, I2;\n",[254,456,457],{"class":256,"line":275},[254,458,459],{"emptyLinePlaceholder":190},"\n",[254,461,463,466,469,472,475,477,480,482,485],{"class":256,"line":462},4,[254,464,465],{"class":414},"    cv::",[254,467,468],{"class":259},"resize",[254,470,471],{"class":414},"(F1, I1, cv::",[254,473,474],{"class":259},"Size",[254,476,415],{"class":414},[254,478,479],{"class":300},"160",[254,481,435],{"class":414},[254,483,484],{"class":300},"120",[254,486,487],{"class":414},"));\n",[254,489,491,493,495,498,500,502,504,506,508],{"class":256,"line":490},5,[254,492,465],{"class":414},[254,494,468],{"class":259},[254,496,497],{"class":414},"(F2, I2, cv::",[254,499,474],{"class":259},[254,501,415],{"class":414},[254,503,479],{"class":300},[254,505,435],{"class":414},[254,507,484],{"class":300},[254,509,487],{"class":414},[254,511,513],{"class":256,"line":512},6,[254,514,459],{"emptyLinePlaceholder":190},[254,516,518],{"class":256,"line":517},7,[254,519,520],{"class":414},"    cv::Mat s1;\n",[254,522,524,526,529,532],{"class":256,"line":523},8,[254,525,465],{"class":414},[254,527,528],{"class":259},"absdiff",[254,530,531],{"class":414},"(I1, I2, s1);",[254,533,535],{"class":534},"sV9Aq","   \u002F\u002F |I1 - I2|\n",[254,537,539,542,544,547,550],{"class":256,"line":538},9,[254,540,541],{"class":424},"    s1",[254,543,35],{"class":414},[254,545,546],{"class":259},"convertTo",[254,548,549],{"class":414},"(s1, CV_32F);",[254,551,552],{"class":534},"  \u002F\u002F cannot make a square on 8 bits\n",[254,554,556,559,562,565,567,570,573],{"class":256,"line":555},10,[254,557,558],{"class":414},"    s1 ",[254,560,561],{"class":407},"=",[254,563,564],{"class":424}," s1",[254,566,35],{"class":414},[254,568,569],{"class":259},"mul",[254,571,572],{"class":414},"(s1);",[254,574,575],{"class":534},"           \u002F\u002F |I1 - I2|^2\n",[254,577,579],{"class":256,"line":578},11,[254,580,459],{"emptyLinePlaceholder":190},[254,582,584,587,589,592,594],{"class":256,"line":583},12,[254,585,586],{"class":414},"    cv::Scalar s ",[254,588,561],{"class":407},[254,590,591],{"class":259}," sum",[254,593,572],{"class":414},[254,595,596],{"class":534},"    \u002F\u002F sum elements per channel\n",[254,598,600],{"class":256,"line":599},13,[254,601,459],{"emptyLinePlaceholder":190},[254,603,605,608,611,613,616,618,622,625,628,631,634,636,638,640,642,644,646,648,650,652,654,656,659,662],{"class":256,"line":604},14,[254,606,607],{"class":407},"    double",[254,609,610],{"class":414}," sse ",[254,612,561],{"class":407},[254,614,615],{"class":424}," s",[254,617,35],{"class":414},[254,619,621],{"class":620},"sVyAn","val",[254,623,624],{"class":414},"[",[254,626,627],{"class":300},"0",[254,629,630],{"class":414},"] ",[254,632,633],{"class":407},"+",[254,635,615],{"class":424},[254,637,35],{"class":414},[254,639,621],{"class":620},[254,641,624],{"class":414},[254,643,34],{"class":300},[254,645,630],{"class":414},[254,647,633],{"class":407},[254,649,615],{"class":424},[254,651,35],{"class":414},[254,653,621],{"class":620},[254,655,624],{"class":414},[254,657,658],{"class":300},"2",[254,660,661],{"class":414},"];",[254,663,664],{"class":534}," \u002F\u002F sum channels\n",[254,666,668],{"class":256,"line":667},15,[254,669,459],{"emptyLinePlaceholder":190},[254,671,673,676,679,682,685,688,691,694,697],{"class":256,"line":672},16,[254,674,675],{"class":407},"    if",[254,677,678],{"class":414},"( sse ",[254,680,681],{"class":407},"\u003C=",[254,683,684],{"class":300}," 1",[254,686,687],{"class":620},"e",[254,689,690],{"class":414},"-",[254,692,693],{"class":300},"10",[254,695,696],{"class":414},") {",[254,698,699],{"class":534},"        \u002F\u002F for small values return zero\n",[254,701,703,706,709,712,715,717,720,723],{"class":256,"line":702},17,[254,704,705],{"class":407},"        return",[254,707,708],{"class":414}," std::",[254,710,711],{"class":424},"numeric_limits",[254,713,714],{"class":414},"\u003C",[254,716,408],{"class":407},[254,718,719],{"class":414},">::",[254,721,722],{"class":259},"infinity",[254,724,725],{"class":414},"();\n",[254,727,729,732,735],{"class":256,"line":728},18,[254,730,731],{"class":414},"    } ",[254,733,734],{"class":407},"else",[254,736,737],{"class":414}," {\n",[254,739,741,744,747,749,751,754,757,759,762,765,767,770,773,776,779,781,784],{"class":256,"line":740},19,[254,742,743],{"class":407},"        double",[254,745,746],{"class":414}," mse  ",[254,748,561],{"class":407},[254,750,610],{"class":414},[254,752,753],{"class":407},"\u002F",[254,755,756],{"class":414}," (",[254,758,408],{"class":407},[254,760,761],{"class":414},")(",[254,763,764],{"class":424},"I1",[254,766,35],{"class":414},[254,768,769],{"class":259},"channels",[254,771,772],{"class":414},"() ",[254,774,775],{"class":407},"*",[254,777,778],{"class":424}," I1",[254,780,35],{"class":414},[254,782,783],{"class":259},"total",[254,785,786],{"class":414},"());\n",[254,788,790,792,795,797,800,803,806,809,812,814,817,820,822],{"class":256,"line":789},20,[254,791,743],{"class":407},[254,793,794],{"class":414}," psnr ",[254,796,561],{"class":407},[254,798,799],{"class":300}," 10.0",[254,801,802],{"class":407}," *",[254,804,805],{"class":259}," log10",[254,807,808],{"class":414},"((",[254,810,811],{"class":300},"255",[254,813,802],{"class":407},[254,815,816],{"class":300}," 255",[254,818,819],{"class":414},") ",[254,821,753],{"class":407},[254,823,824],{"class":414}," mse);\n",[254,826,828,830],{"class":256,"line":827},21,[254,829,705],{"class":407},[254,831,832],{"class":414}," psnr;\n",[254,834,836],{"class":256,"line":835},22,[254,837,838],{"class":414},"    }\n",[206,840,842],{"id":841},"optimisation","Optimisation",[11,844,845],{},"La raison qui fait que je voulais m'amuser avec OpenCV c'est qu'il permet de faire ces calculs à l'aide du GPU au lieu du CPU.",[11,847,848,849,854],{},"L'utilisation du GPU permet d'améliorer la vitesse de calcul pour tout ce qui est traitement d'image, ce pour quoi un GPU est prévu pour. Pour plus d'informations sur\nl'utilisation du GPU dans OpenCV peut être trouvé sur la page ",[27,850,853],{"href":851,"rel":852},"http:\u002F\u002Fopencv.org\u002Fplatforms\u002Fcuda.html",[155],"CUDA"," d'OpenCV.",[11,856,857],{},"Le problème est que sur la version de Debian jessie que j'utilise, OpenCV n'est pas compilé avec CUDA, et ne permet donc pas d'utiliser le GPU. J'ai donc dû compiler ma propre\nversion d'OpenCV.",[11,859,860],{},"Pour cela la première étape consiste à récupérer le code source et à se positionner sur la branche que l'on souhaite compiler. Pour ma part je préfère compiler sur la branche 2.4,\nplus proche de la version de Debian.",[245,862,864],{"className":247,"code":863,"language":249,"meta":32,"style":32},"git clone https:\u002F\u002Fgithub.com\u002Fopencv\u002Fopencv.git\ngit checkout 2.4\n",[251,865,866,877],{"__ignoreMap":32},[254,867,868,871,874],{"class":256,"line":197},[254,869,870],{"class":259},"git",[254,872,873],{"class":263}," clone",[254,875,876],{"class":263}," https:\u002F\u002Fgithub.com\u002Fopencv\u002Fopencv.git\n",[254,878,879,881,884],{"class":256,"line":165},[254,880,870],{"class":259},[254,882,883],{"class":263}," checkout",[254,885,886],{"class":300}," 2.4\n",[11,888,889],{},"Viens ensuite la compilation :",[245,891,893],{"className":247,"code":892,"language":249,"meta":32,"style":32},"mkdir build\ncd build\ncmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=\u002Fhome\u002Fphoenix\u002Fusr\u002Flocal  -DENABLE_SSE=ON -DENABLE_SSE2=ON -DENABLE_SSE3=ON -DWITH_TBB=ON -DWITH_1394=ON -DWITH_V4L=ON -DWITH_OPENGL=ON  -DWITH_GTK=ON -DWITH_JASPER=ON -DWITH_JPEG=ON -DWITH_PNG=ON -DWITH_TIFF=ON  -DWITH_OPENEXR=ON -DWITH_PVAPI=ON   -DWITH_EIGEN=ON -DCMAKE_SKIP_RPATH=ON -D WITH_CUDA=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -DWITH_IPP=ON -D CUDA_GENERATION=Auto -D WITH_FFMPEG=ON  ..\u002F\n",[251,894,895,902,908],{"__ignoreMap":32},[254,896,897,899],{"class":256,"line":197},[254,898,260],{"class":259},[254,900,901],{"class":263}," build\n",[254,903,904,906],{"class":256,"line":165},[254,905,270],{"class":269},[254,907,901],{"class":263},[254,909,910,913,916,919,921,924,927,930,933,936,939,942,945,948,951,954,957,960,963,966,969,972,974,977,979,982,984,986,989,991,993,996,998,1001,1003,1006,1008,1011],{"class":256,"line":275},[254,911,912],{"class":259},"cmake",[254,914,915],{"class":300}," -D",[254,917,918],{"class":263}," CMAKE_BUILD_TYPE=RELEASE",[254,920,915],{"class":300},[254,922,923],{"class":263}," CMAKE_INSTALL_PREFIX=\u002Fhome\u002Fphoenix\u002Fusr\u002Flocal",[254,925,926],{"class":300},"  -DENABLE_SSE=ON",[254,928,929],{"class":300}," -DENABLE_SSE2=ON",[254,931,932],{"class":300}," -DENABLE_SSE3=ON",[254,934,935],{"class":300}," -DWITH_TBB=ON",[254,937,938],{"class":300}," -DWITH_1394=ON",[254,940,941],{"class":300}," -DWITH_V4L=ON",[254,943,944],{"class":300}," -DWITH_OPENGL=ON",[254,946,947],{"class":300},"  -DWITH_GTK=ON",[254,949,950],{"class":300}," -DWITH_JASPER=ON",[254,952,953],{"class":300}," -DWITH_JPEG=ON",[254,955,956],{"class":300}," -DWITH_PNG=ON",[254,958,959],{"class":300}," -DWITH_TIFF=ON",[254,961,962],{"class":300},"  -DWITH_OPENEXR=ON",[254,964,965],{"class":300}," -DWITH_PVAPI=ON",[254,967,968],{"class":300},"   -DWITH_EIGEN=ON",[254,970,971],{"class":300}," -DCMAKE_SKIP_RPATH=ON",[254,973,915],{"class":300},[254,975,976],{"class":263}," WITH_CUDA=ON",[254,978,915],{"class":300},[254,980,981],{"class":263}," ENABLE_FAST_MATH=",[254,983,34],{"class":300},[254,985,915],{"class":300},[254,987,988],{"class":263}," CUDA_FAST_MATH=",[254,990,34],{"class":300},[254,992,915],{"class":300},[254,994,995],{"class":263}," WITH_CUBLAS=",[254,997,34],{"class":300},[254,999,1000],{"class":300}," -DWITH_IPP=ON",[254,1002,915],{"class":300},[254,1004,1005],{"class":263}," CUDA_GENERATION=Auto",[254,1007,915],{"class":300},[254,1009,1010],{"class":263}," WITH_FFMPEG=ON",[254,1012,1013],{"class":263},"  ..\u002F\n",[11,1015,1016],{},"J'active lors de la compilation le maximum d'optimisation dont CUDA. J'active également FFMPEG sans lequel le nombre de fichier reconnu baisse énormément sur ma machine. Après\navoir lancé cmake j'obtiens le résultat suivant :",[245,1018,1023],{"className":1019,"code":1021,"language":1022},[1020],"language-text","-- General configuration for OpenCV 2.4.13.1 =====================================\n--   Version control:               2.4.13.1-48-gac118ae\n--\n--   Platform:\n--     Host:                        Linux 3.16.0-4-amd64 x86_64\n--     CMake:                       3.6.2\n--     CMake generator:             Unix Makefiles\n--     CMake build tool:            \u002Fusr\u002Fbin\u002Fmake\n--     Configuration:               RELEASE\n--\n--   C\u002FC++:\n--     Built as dynamic libs?:      YES\n--     C++ Compiler:                \u002Fusr\u002Fbin\u002Fc++  (ver 4.9.2)\n--     C++ flags (Release):         -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -Wno-array-bounds -Wno-aggressive-loop-optimizations -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffast-math -msse -msse2 -msse3 -ffunction-sections -O3 -DNDEBUG  -DNDEBUG\n--     C++ flags (Debug):           -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -Wno-array-bounds -Wno-aggressive-loop-optimizations -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffast-math -msse -msse2 -msse3 -ffunction-sections -g  -O0 -DDEBUG -D_DEBUG\n--     C Compiler:                  \u002Fusr\u002Fbin\u002Fcc\n--     C flags (Release):           -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wno-narrowing -Wno-comment -Wno-array-bounds -Wno-aggressive-loop-optimizations -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffast-math -msse -msse2 -msse3 -ffunction-sections -O3 -DNDEBUG  -DNDEBUG\n--     C flags (Debug):             -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wno-narrowing -Wno-comment -Wno-array-bounds -Wno-aggressive-loop-optimizations -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffast-math -msse -msse2 -msse3 -ffunction-sections -g  -O0 -DDEBUG -D_DEBUG\n--     Linker flags (Release):\n--     Linker flags (Debug):\n--     ccache:                      NO\n--     Precompiled headers:         YES\n--\n--   OpenCV modules:\n--     To be built:                 core flann imgproc highgui features2d calib3d ml video legacy objdetect photo gpu ocl nonfree contrib java python stitching superres ts videostab\n--     Disabled:                    world\n--     Disabled by dependency:      -\n--     Unavailable:                 androidcamera dynamicuda viz\n--\n--   GUI:\n--     QT:                          NO\n--     GTK+ 2.x:                    YES (ver 2.24.25)\n--     GThread :                    YES (ver 2.42.1)\n--     GtkGlExt:                    NO\n--     OpenGL support:              NO\n--     VTK support:                 NO\n--\n--   Media I\u002FO:\n--     ZLib:                        \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002Flibz.so (ver 1.2.8)\n--     JPEG:                        \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002Flibjpeg.so (ver )\n--     PNG:                         \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002Flibpng.so (ver 1.2.50)\n--     TIFF:                        \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002Flibtiff.so (ver 42 - 4.0.3)\n--     JPEG 2000:                   \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002Flibjasper.so (ver 1.900.1)\n--     OpenEXR:                     \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002FlibImath.so \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002FlibIlmImf.so \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002FlibIex.so \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002FlibHalf.so \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002FlibIlmThread.so (ver 1.6.1)\n--\n--   Video I\u002FO:\n--     DC1394 1.x:                  NO\n--     DC1394 2.x:                  YES (ver 2.2.3)\n--     FFMPEG:                      YES\n--       codec:                     YES (ver 56.1.0)\n--       format:                    YES (ver 56.1.0)\n--       util:                      YES (ver 54.3.0)\n--       swscale:                   YES (ver 3.0.0)\n--       resample:                  YES (ver 2.1.0)\n--       gentoo-style:              YES\n--     GStreamer:                   NO\n--     OpenNI:                      NO\n--     OpenNI PrimeSensor Modules:  NO\n--     PvAPI:                       NO\n--     GigEVisionSDK:               NO\n--     UniCap:                      NO\n--     UniCap ucil:                 NO\n--     V4L\u002FV4L2:                    NO\u002FYES\n--     XIMEA:                       NO\n--     Xine:                        NO\n--\n--   Other third-party libraries:\n--     Use IPP:                     IPP not found\n--     Use Eigen:                   NO\n--     Use TBB:                     NO\n--     Use OpenMP:                  NO\n--     Use GCD                      NO\n--     Use Concurrency              NO\n--     Use C=:                      NO\n--     Use Cuda:                    YES (ver 7.5)\n--     Use OpenCL:                  YES\n--\n--   NVIDIA CUDA\n--     Use CUFFT:                   YES\n--     Use CUBLAS:                  YES\n--     USE NVCUVID:                 NO\n--     NVIDIA GPU arch:             21\n--     NVIDIA PTX archs:\n--     Use fast math:               YES\n--     Tiny gpu module:             NO\n--\n--   OpenCL:\n--     Version:                     dynamic\n--     Include path:                \u002Fhome\u002Fphoenix\u002FDeveloppement\u002FExternalSoftware\u002Fopencv\u002F3rdparty\u002Finclude\u002Fopencl\u002F1.2\n--     Use AMD FFT:                 NO\n--     Use AMD BLAS:                NO\n--\n--   Python:\n--     Interpreter:                 \u002Fusr\u002Fbin\u002Fpython2 (ver 2.7.10)\n--     Libraries:                   \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002Flibpython2.7.so (ver 2.7.10rc1)\n--     numpy:                       \u002Fusr\u002Flib\u002Fpython2.7\u002Fdist-packages\u002Fnumpy\u002Fcore\u002Finclude (ver 1.8.2)\n--     packages path:               lib\u002Fpython2.7\u002Fdist-packages\n--\n--   Java:\n--     ant:                         \u002Fusr\u002Fbin\u002Fant (ver 1.9.4)\n--     JNI:                         \u002Fusr\u002Flib\u002Fjvm\u002Fjava-7-openjdk-amd64\u002Finclude \u002Fusr\u002Flib\u002Fjvm\u002Fjava-7-openjdk-amd64\u002Finclude \u002Fusr\u002Flib\u002Fjvm\u002Fjava-7-openjdk-amd64\u002Finclude\n--     Java tests:                  YES\n--\n--   Documentation:\n--     Build Documentation:         NO\n--     Sphinx:                      NO\n--     PdfLaTeX compiler:           \u002Fusr\u002Fbin\u002Fpdflatex\n--     Doxygen:                     YES (\u002Fusr\u002Fbin\u002Fdoxygen)\n--\n--   Tests and samples:\n--     Tests:                       YES\n--     Performance tests:           YES\n--     C\u002FC++ Examples:              NO\n--\n--   Install path:                  \u002Fhome\u002Fphoenix\u002Fusr\u002Flocal\n--\n--   cvconfig.h is in:              \u002Fhome\u002Fphoenix\u002FDeveloppement\u002FExternalSoftware\u002Fopencv\u002Fbuild\n-- -----------------------------------------------------------------\n","text",[251,1024,1021],{"__ignoreMap":32},[11,1026,1027,1028,1031,1032,1035,1036,1039],{},"Pour que la compilation se déroule sans problème, il vous faudra installer certains paquets sur votre distribution. Sur Debian Jessie, j'ai installé ",[251,1029,1030],{},"nvidia-cuda-toolkit"," en\nversion ",[251,1033,1034],{},"7.5.18-4~bpo8+1",". Comme vous pouvez les voir c'est une version qui provient du repository de backports. La version ",[251,1037,1038],{},"6.0.37-5"," ne me permettait pas d'activer CUDA. J'ai\ndonc du monter l'ensemble du driver propriétaire sur mon poste de développement.",[11,1041,1042],{},"Rasssurez-vous, si vous ne voulez pas utiliser les backports ou ne pas utiliser de driver propriétaire, vous pouvez tester le programme dans sa version CPU. :)",[11,1044,1045],{},"Voici comment le code a été ré-écrit pour utiliser le GPU à la place du CPU:",[245,1047,1049],{"className":398,"code":1048,"language":400,"meta":32,"style":32},"struct BufferPSNR {                                    \u002F\u002F Optimized GPU versions\n    \u002F\u002F Data allocations are very expensive on GPU. Use a buffer to solve: allocate once reuse later.\n    cv::gpu::GpuMat gF1, gF2, gI1, gI2, gs, t1,t2;\n\n    cv::gpu::GpuMat buf;\n};\n\ndouble getPSNR_GPU_optimized(const cv::Mat& F1, const cv::Mat& F2, BufferPSNR& b) {\n    b.gF1.upload(F1);\n    b.gF2.upload(F2);\n\n    cv::gpu::resize(b.gF1, b.gI1, cv::Size(160, 120));\n    cv::gpu::resize(b.gF2, b.gI2, cv::Size(160, 120));\n\n    b.gI1.convertTo(b.t1, CV_32F);\n    b.gI2.convertTo(b.t2, CV_32F);\n\n    cv::gpu::absdiff(b.t1.reshape(1), b.t2.reshape(1), b.gs);\n    cv::gpu::multiply(b.gs, b.gs, b.gs);\n\n    double sse = cv::gpu::sum(b.gs, b.buf)[0];\n\n    if( sse \u003C= 1e-10) \u002F\u002F for small values return zero\n        return std::numeric_limits\u003Cdouble>::infinity();\n    else {\n        double mse = sse \u002F(double)(F1.channels() * F1.total());\n        double psnr = 10.0*log10((255*255)\u002Fmse);\n        return psnr;\n    }\n}\n",[251,1050,1051,1065,1070,1075,1079,1084,1089,1093,1136,1154,1170,1174,1219,1260,1264,1288,1311,1315,1371,1408,1412,1454,1458,1481,1500,1508,1547,1578,1585,1590],{"__ignoreMap":32},[254,1052,1053,1056,1059,1062],{"class":256,"line":197},[254,1054,1055],{"class":407},"struct",[254,1057,1058],{"class":424}," BufferPSNR",[254,1060,1061],{"class":414}," {",[254,1063,1064],{"class":534},"                                    \u002F\u002F Optimized GPU versions\n",[254,1066,1067],{"class":256,"line":165},[254,1068,1069],{"class":534},"    \u002F\u002F Data allocations are very expensive on GPU. Use a buffer to solve: allocate once reuse later.\n",[254,1071,1072],{"class":256,"line":275},[254,1073,1074],{"class":414},"    cv::gpu::GpuMat gF1, gF2, gI1, gI2, gs, t1,t2;\n",[254,1076,1077],{"class":256,"line":462},[254,1078,459],{"emptyLinePlaceholder":190},[254,1080,1081],{"class":256,"line":490},[254,1082,1083],{"class":414},"    cv::gpu::GpuMat buf;\n",[254,1085,1086],{"class":256,"line":512},[254,1087,1088],{"class":414},"};\n",[254,1090,1091],{"class":256,"line":517},[254,1092,459],{"emptyLinePlaceholder":190},[254,1094,1095,1097,1100,1102,1104,1106,1108,1110,1112,1114,1116,1118,1120,1122,1124,1126,1129,1131,1134],{"class":256,"line":523},[254,1096,408],{"class":407},[254,1098,1099],{"class":259}," getPSNR_GPU_optimized",[254,1101,415],{"class":414},[254,1103,418],{"class":407},[254,1105,421],{"class":414},[254,1107,425],{"class":424},[254,1109,428],{"class":407},[254,1111,432],{"class":431},[254,1113,435],{"class":414},[254,1115,418],{"class":407},[254,1117,421],{"class":414},[254,1119,425],{"class":424},[254,1121,428],{"class":407},[254,1123,446],{"class":431},[254,1125,435],{"class":414},[254,1127,1128],{"class":424},"BufferPSNR",[254,1130,428],{"class":407},[254,1132,1133],{"class":431}," b",[254,1135,449],{"class":414},[254,1137,1138,1141,1143,1146,1148,1151],{"class":256,"line":538},[254,1139,1140],{"class":424},"    b",[254,1142,35],{"class":414},[254,1144,1145],{"class":424},"gF1",[254,1147,35],{"class":414},[254,1149,1150],{"class":259},"upload",[254,1152,1153],{"class":414},"(F1);\n",[254,1155,1156,1158,1160,1163,1165,1167],{"class":256,"line":555},[254,1157,1140],{"class":424},[254,1159,35],{"class":414},[254,1161,1162],{"class":424},"gF2",[254,1164,35],{"class":414},[254,1166,1150],{"class":259},[254,1168,1169],{"class":414},"(F2);\n",[254,1171,1172],{"class":256,"line":578},[254,1173,459],{"emptyLinePlaceholder":190},[254,1175,1176,1178,1181,1184,1186,1188,1191,1193,1195,1197,1199,1201,1204,1207,1209,1211,1213,1215,1217],{"class":256,"line":583},[254,1177,465],{"class":414},[254,1179,1180],{"class":424},"gpu",[254,1182,1183],{"class":414},"::",[254,1185,468],{"class":259},[254,1187,415],{"class":414},[254,1189,1190],{"class":424},"b",[254,1192,35],{"class":414},[254,1194,1145],{"class":620},[254,1196,435],{"class":414},[254,1198,1190],{"class":424},[254,1200,35],{"class":414},[254,1202,1203],{"class":620},"gI1",[254,1205,1206],{"class":414},", cv::",[254,1208,474],{"class":259},[254,1210,415],{"class":414},[254,1212,479],{"class":300},[254,1214,435],{"class":414},[254,1216,484],{"class":300},[254,1218,487],{"class":414},[254,1220,1221,1223,1225,1227,1229,1231,1233,1235,1237,1239,1241,1243,1246,1248,1250,1252,1254,1256,1258],{"class":256,"line":599},[254,1222,465],{"class":414},[254,1224,1180],{"class":424},[254,1226,1183],{"class":414},[254,1228,468],{"class":259},[254,1230,415],{"class":414},[254,1232,1190],{"class":424},[254,1234,35],{"class":414},[254,1236,1162],{"class":620},[254,1238,435],{"class":414},[254,1240,1190],{"class":424},[254,1242,35],{"class":414},[254,1244,1245],{"class":620},"gI2",[254,1247,1206],{"class":414},[254,1249,474],{"class":259},[254,1251,415],{"class":414},[254,1253,479],{"class":300},[254,1255,435],{"class":414},[254,1257,484],{"class":300},[254,1259,487],{"class":414},[254,1261,1262],{"class":256,"line":604},[254,1263,459],{"emptyLinePlaceholder":190},[254,1265,1266,1268,1270,1272,1274,1276,1278,1280,1282,1285],{"class":256,"line":667},[254,1267,1140],{"class":424},[254,1269,35],{"class":414},[254,1271,1203],{"class":424},[254,1273,35],{"class":414},[254,1275,546],{"class":259},[254,1277,415],{"class":414},[254,1279,1190],{"class":424},[254,1281,35],{"class":414},[254,1283,1284],{"class":620},"t1",[254,1286,1287],{"class":414},", CV_32F);\n",[254,1289,1290,1292,1294,1296,1298,1300,1302,1304,1306,1309],{"class":256,"line":672},[254,1291,1140],{"class":424},[254,1293,35],{"class":414},[254,1295,1245],{"class":424},[254,1297,35],{"class":414},[254,1299,546],{"class":259},[254,1301,415],{"class":414},[254,1303,1190],{"class":424},[254,1305,35],{"class":414},[254,1307,1308],{"class":620},"t2",[254,1310,1287],{"class":414},[254,1312,1313],{"class":256,"line":702},[254,1314,459],{"emptyLinePlaceholder":190},[254,1316,1317,1319,1321,1323,1325,1327,1329,1331,1333,1335,1338,1340,1342,1345,1347,1349,1351,1353,1355,1357,1359,1361,1363,1365,1368],{"class":256,"line":728},[254,1318,465],{"class":414},[254,1320,1180],{"class":424},[254,1322,1183],{"class":414},[254,1324,528],{"class":259},[254,1326,415],{"class":414},[254,1328,1190],{"class":424},[254,1330,35],{"class":414},[254,1332,1284],{"class":424},[254,1334,35],{"class":414},[254,1336,1337],{"class":259},"reshape",[254,1339,415],{"class":414},[254,1341,34],{"class":300},[254,1343,1344],{"class":414},"), ",[254,1346,1190],{"class":424},[254,1348,35],{"class":414},[254,1350,1308],{"class":424},[254,1352,35],{"class":414},[254,1354,1337],{"class":259},[254,1356,415],{"class":414},[254,1358,34],{"class":300},[254,1360,1344],{"class":414},[254,1362,1190],{"class":424},[254,1364,35],{"class":414},[254,1366,1367],{"class":620},"gs",[254,1369,1370],{"class":414},");\n",[254,1372,1373,1375,1377,1379,1382,1384,1386,1388,1390,1392,1394,1396,1398,1400,1402,1404,1406],{"class":256,"line":740},[254,1374,465],{"class":414},[254,1376,1180],{"class":424},[254,1378,1183],{"class":414},[254,1380,1381],{"class":259},"multiply",[254,1383,415],{"class":414},[254,1385,1190],{"class":424},[254,1387,35],{"class":414},[254,1389,1367],{"class":620},[254,1391,435],{"class":414},[254,1393,1190],{"class":424},[254,1395,35],{"class":414},[254,1397,1367],{"class":620},[254,1399,435],{"class":414},[254,1401,1190],{"class":424},[254,1403,35],{"class":414},[254,1405,1367],{"class":620},[254,1407,1370],{"class":414},[254,1409,1410],{"class":256,"line":789},[254,1411,459],{"emptyLinePlaceholder":190},[254,1413,1414,1416,1418,1420,1422,1424,1426,1429,1431,1433,1435,1437,1439,1441,1443,1446,1449,1451],{"class":256,"line":827},[254,1415,607],{"class":407},[254,1417,610],{"class":414},[254,1419,561],{"class":407},[254,1421,421],{"class":414},[254,1423,1180],{"class":424},[254,1425,1183],{"class":414},[254,1427,1428],{"class":259},"sum",[254,1430,415],{"class":414},[254,1432,1190],{"class":424},[254,1434,35],{"class":414},[254,1436,1367],{"class":620},[254,1438,435],{"class":414},[254,1440,1190],{"class":424},[254,1442,35],{"class":414},[254,1444,1445],{"class":620},"buf",[254,1447,1448],{"class":414},")[",[254,1450,627],{"class":300},[254,1452,1453],{"class":414},"];\n",[254,1455,1456],{"class":256,"line":835},[254,1457,459],{"emptyLinePlaceholder":190},[254,1459,1461,1463,1465,1467,1469,1471,1473,1475,1478],{"class":256,"line":1460},23,[254,1462,675],{"class":407},[254,1464,678],{"class":414},[254,1466,681],{"class":407},[254,1468,684],{"class":300},[254,1470,687],{"class":620},[254,1472,690],{"class":414},[254,1474,693],{"class":300},[254,1476,1477],{"class":414},")",[254,1479,1480],{"class":534}," \u002F\u002F for small values return zero\n",[254,1482,1484,1486,1488,1490,1492,1494,1496,1498],{"class":256,"line":1483},24,[254,1485,705],{"class":407},[254,1487,708],{"class":414},[254,1489,711],{"class":424},[254,1491,714],{"class":414},[254,1493,408],{"class":407},[254,1495,719],{"class":414},[254,1497,722],{"class":259},[254,1499,725],{"class":414},[254,1501,1503,1506],{"class":256,"line":1502},25,[254,1504,1505],{"class":407},"    else",[254,1507,737],{"class":414},[254,1509,1511,1513,1516,1518,1520,1522,1524,1526,1528,1531,1533,1535,1537,1539,1541,1543,1545],{"class":256,"line":1510},26,[254,1512,743],{"class":407},[254,1514,1515],{"class":414}," mse ",[254,1517,561],{"class":407},[254,1519,610],{"class":414},[254,1521,753],{"class":407},[254,1523,415],{"class":414},[254,1525,408],{"class":407},[254,1527,761],{"class":414},[254,1529,1530],{"class":424},"F1",[254,1532,35],{"class":414},[254,1534,769],{"class":259},[254,1536,772],{"class":414},[254,1538,775],{"class":407},[254,1540,432],{"class":424},[254,1542,35],{"class":414},[254,1544,783],{"class":259},[254,1546,786],{"class":414},[254,1548,1550,1552,1554,1556,1558,1560,1563,1565,1567,1569,1571,1573,1575],{"class":256,"line":1549},27,[254,1551,743],{"class":407},[254,1553,794],{"class":414},[254,1555,561],{"class":407},[254,1557,799],{"class":300},[254,1559,775],{"class":407},[254,1561,1562],{"class":259},"log10",[254,1564,808],{"class":414},[254,1566,811],{"class":300},[254,1568,775],{"class":407},[254,1570,811],{"class":300},[254,1572,1477],{"class":414},[254,1574,753],{"class":407},[254,1576,1577],{"class":414},"mse);\n",[254,1579,1581,1583],{"class":256,"line":1580},28,[254,1582,705],{"class":407},[254,1584,832],{"class":414},[254,1586,1588],{"class":256,"line":1587},29,[254,1589,838],{"class":414},[254,1591,1593],{"class":256,"line":1592},30,[254,1594,1595],{"class":414},"}\n",[11,1597,1598,1599,1601,1602,1605],{},"L'utilisation de la structure ",[251,1600,1128],{}," permet de ne pas perdre de performance lors de l'initialisation relativement lourde des objets ",[251,1603,1604],{},"GpuMat",". Sans cela, l'utilisation du Gpu\nserait moins performant que la version Cpu.",[206,1607,1609],{"id":1608},"lexpérience","L'expérience",[11,1611,1612],{},"Maintenant place à l'expérience. Nous allons lancer notre programme sur notre jeu d'essai comprenant les vidéos issue des DVD, ainsi que les vidéos recompressées pour l'expérience.\nSi l'expérence se déroule bien l'algorithme devrait nous detecter les fichiers dupliqués, ainsi que les fichiers recompressés.",[139,1614,1616],{"id":1615},"lancement-et-selection-des-dossiers","Lancement et selection des dossiers",[11,1618,1619],{},"La première étape est la sélection des dossiers que l'on souhaite comparer. Le programme ira lire récursivement l'ensemble des dossiers pour y trouver l'ensemble des fichiers\nvidéos.",[11,1621,1622],{},"La sélection d'un projet provient de mon envie de départ de pouvoir enregistrer l'avancement du projet au fur et à mesure. Cette étape n'a pas été réalisée mais l'existance du mode\nprojet existe toujours.",[11,1624,1625],{},[42,1626],{"alt":1627,"src":1628},"Selection du projet","\u002FProgrammation\u002Ffind-similarity\u002Ffind-similarity-1.png",[11,1630,1631],{},"Une fois le dossier projet choisi, il faut sélectionner la liste des dossiers contenant les vidéos et lancer le programme ...",[139,1633,1635],{"id":1634},"comparaison-des-vidéos","Comparaison des vidéos",[11,1637,1638,1639,35],{},"Dans cette étape le programme compare l'ensemble des vidéos présentes dans les dossiers. L'ensemble du processus tourne dans des threads afin de ne pas figer l'IHM, grâce à l'API\n",[251,1640,1641],{},"QtConcurrent",[11,1643,1644,1648],{},[42,1645],{"alt":1646,"src":1647},"Recherche","\u002FProgrammation\u002Ffind-similarity\u002Ffind-similarity-2.png",[42,1649],{"alt":1650,"src":1651},"Recherche encore","\u002FProgrammation\u002Ffind-similarity\u002Ffind-similarity-3.png",[11,1653,1654],{},"Les étapes de la recherche sont donc :",[65,1656,1657,1660,1663,1666,1669],{},[68,1658,1659],{},"Constitution de la liste des fichiers",[68,1661,1662],{},"Récupération des méta-données",[68,1664,1665],{},"Création de la liste des paires de fichiers (en filtrant sur la durée)",[68,1667,1668],{},"Calcul du PSNR pour chaque paire de fichiers",[68,1670,1671],{},"Filtrage pour ne garder que les paires de fichiers dont le PSNR est supérieur à 30 db.",[11,1673,1674,1675,1677,1678,1680,1681,1684,1685,1688],{},"Lors de mon développement je me suis basé sur l'API ",[251,1676,1641],{}," pour faire les différentes étapes. Faisant beaucoup de développement NodeJS ces derniers temps je suis habitué à\nl'utilisation des promesses et de leur enchainement pour faire des processus complexes. J'ai trouvé dommage de ne pas retrouver la même chose dans l'API ",[251,1679,1641],{},". Pour\nreproduire un équivalent, lorsqu'un ",[251,1682,1683],{},"QFuture","se termine, le signal émis par ",[251,1686,1687],{},"QFutureWatcher"," est récupérer par un SLOT du moteur qui s'occupe de lancer l'étape suivante.",[139,1690,1692],{"id":1691},"la-page-de-résultat","La page de résultat",[11,1694,1695],{},"La page de résultat liste les vidéos considérées identiques suite à l'étude d'une des images. Un coup d'oeil visuel permet alors de se faire un avis sur la question, et de\nsupprimer la vidéo que l'on souhaite.",[11,1697,1698],{},[42,1699],{"alt":1700,"src":1701},"Résultat 1","\u002FProgrammation\u002Ffind-similarity\u002Ffind-similarity-4.png",[11,1703,1704],{},"Comme on peut le voir le programme retrouve les vidéos dont l'image est identique, ainsi que les films qui ont été redimensionnés sans trop de soucis.\nLe problème se situe alors au niveau du bruit qui est généré. Plusieurs films sont considérés comme proches alors que complètement différents. Pour régler ce problème, comparer\nplusieurs images d'une même vidéo à des timestamps différents pourrait peut-être régler le problème.",[11,1706,1707],{},[42,1708],{"alt":1709,"src":1710},"Résultat 2","\u002FProgrammation\u002Ffind-similarity\u002Ffind-similarity-5.png",[11,1712,1713],{},[1714,1715,1716],"strong",{},"Je vous conseille de vérifier manuellement la qualité et la similarité de chaque vidéo manuellement avant toute suppression.",[206,1718,1720],{"id":1719},"conclusion","Conclusion",[11,1722,1723],{},"En conclusion, j'ai trouvé l'expérience intéressante, et maintenant qu'elle est terminée, je vais pouvoir en tenter une autre ;). Est-ce que le programme continuera d'évoluer ?\nPourquoi pas ? Cela dépendera des PR (Pull Request) et des demandes faites par les utilisateurs, ainsi que du temps que j'ai envie de passer dessus.",[1725,1726,1727],"style",{},"html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .seHd6, html code.shiki .seHd6{--shiki-default:#C678DD}html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sU0A5, html code.shiki .sU0A5{--shiki-default:#E5C07B}html pre.shiki code .s_ZVi, html code.shiki .s_ZVi{--shiki-default:#E06C75;--shiki-default-font-style:italic}html pre.shiki code .sV9Aq, html code.shiki .sV9Aq{--shiki-default:#7F848E;--shiki-default-font-style:italic}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}",{"title":32,"searchDepth":165,"depth":165,"links":1729},[1730,1731,1732,1733,1734,1735,1736,1737],{"id":208,"depth":275,"text":209},{"id":236,"depth":275,"text":237},{"id":342,"depth":275,"text":343},{"id":841,"depth":275,"text":842},{"id":1608,"depth":275,"text":1609},{"id":1615,"depth":165,"text":1616},{"id":1634,"depth":165,"text":1635},{"id":1691,"depth":165,"text":1692,"children":1738},[1739],{"id":1719,"depth":275,"text":1720},"Programmation","programmation","2016-12-10",{"type":8,"value":1744},[1745,1747,1749,1751,1753,1755,1759],[206,1746,209],{"id":208},[11,1748,212],{},[11,1750,215],{},[11,1752,218],{},[11,1754,221],{},[11,1756,1757],{},[15,1758,226],{},[11,1760,229,1761,35],{},[27,1762,232],{"href":232,"rel":1763},[155],{"planet":190},"\u002Fpost\u002Ffindsimilarity",{"title":202,"description":32},"findsimilarity","posts\u002FProgrammation\u002F2016-12-10-findsimilarity",[196,1770,1771,1772],"opencv","video","debian","LR-Ko6CoDmyd4rJj7msRVs_pkiaov-yO2_RYmY_C6cE",{"id":1775,"title":1776,"author":6,"body":1777,"category":1740,"categorySlug":1741,"date":3620,"description":32,"excerpt":3621,"extension":187,"location":188,"meta":3662,"navigation":190,"path":3663,"published":190,"seo":3664,"slug":3665,"stem":3666,"tags":3667,"timeToRead":538,"__hash__":3668},"posts\u002Fposts\u002FProgrammation\u002F2012-07-01-cross-compilation-compiler-un-programme-pour-ms-windows-sous-gnu-linux.md","Cross-Compilation - Compiler un programme pour MS\u002FWindows sous Gnu\u002FLinux",{"type":8,"value":1778,"toc":3610},[1779,1789,1792,1795,1798,1828,1831,1837,1841,1857,1860,1886,1889,1900,1903,1922,1931,1934,2045,2048,2051,2130,2133,2190,2193,2208,2211,2243,2246,2600,2603,2899,2902,2906,2909,2912,3030,3037,3092,3099,3105,3108,3116,3122,3125,3131,3134,3145,3148,3180,3192,3488,3491,3510,3516,3518,3521,3607],[206,1780,1782,1783,1788],{"id":1781},"quest-que-la-cross-compilation1","Qu'est que la cross-compilation",[24,1784,1785],{},[27,1786,34],{"href":29,"ariaDescribedBy":1787,"dataFootnoteRef":32,"id":33},[31]," ?",[11,1790,1791],{},"La cross compilation est la possibilité sur une machine avec un matériel\nspécifique (architecture) et avec un système d'exploitation donné, de\ncompiler des programmes pour une autre architecture, ou pour un autre\nsystème d'exploitation.",[11,1793,1794],{},"Cela peut être utilisé par exemple pour compiler un programme sur votre\nordinateur de tous les jours (sous Gnu\u002FLinux, avec une architecture\ni386) à destination de votre téléphone mobile, qui lui est sous Symbian\navec un processeur ARM.",[11,1796,1797],{},"Les raisons de faire de la compilation croisée peuvent donc être\nmultiples :",[65,1799,1800,1803,1814,1825],{},[68,1801,1802],{},"Éviter de redémarrer votre machine pour compiler vos binaires.",[68,1804,1805,1806,1813],{},"Disponibilité des outils sur votre machine \u002F Indisponibilité des\noutils de compilation sur la machine de destination (on trouve\nrarement des outils de compilation sur des téléphones\nportables",[24,1807,1808],{},[27,1809,658],{"href":1810,"ariaDescribedBy":1811,"dataFootnoteRef":32,"id":1812},"#user-content-fn-2",[31],"user-content-fnref-2",").",[68,1815,1816,1817,1813],{},"Puissances des calculs (la compilation prendra moins de temps sur\nvotre PC de bureau que sur votre appareil mobile",[24,1818,1819],{},[27,1820,1824],{"href":1821,"ariaDescribedBy":1822,"dataFootnoteRef":32,"id":1823},"#user-content-fn-3",[31],"user-content-fnref-3","3",[68,1826,1827],{},"Licence : Vous voulez compiler à destination d'un système\nd'exploitation que vous ne possédez pas",[11,1829,1830],{},"Attention: La compilation croisée ne garantie pas que programme\nfonctionnera, vous devrez toujours faire quelques tests à partir d'un\némulateur ou à partir du système d'exploitation final.",[11,1832,1833,1834,35],{},"Bref, à partir du moment où vous avez besoin de compiler un programme\npour une autre architecture, ou pour un autre système d'exploitation que\nvotre machine actuelle, vous avez besoin de faire de la ",[15,1835,1836],{},"compilation\ncroisée",[206,1838,1840],{"id":1839},"de-quoi-va-parler-ce-billet","De quoi va parler ce billet ?",[11,1842,1843,1844,1847,1848,1856],{},"Ce billet ne va pas parler de la ",[15,1845,1846],{},"compilation croisée"," entre deux\narchitectures différentes, mais uniquement de la compilation croisée à\ndestination d'une machine Windows à partir d'une machine Linux. La\ncompilation croisée entre architectures pourra être vue dans un\nfutur",[24,1849,1850],{},[27,1851,1855],{"href":1852,"ariaDescribedBy":1853,"dataFootnoteRef":32,"id":1854},"#user-content-fn-4",[31],"user-content-fnref-4","4"," article, ou sur d'autres sites.",[11,1858,1859],{},"Afin de pouvoir faire de la compilation croisée, il vous faudra\ninstaller les outils suivants :",[65,1861,1862,1874],{},[68,1863,1864,1865,1873],{},"MinGW",[24,1866,1867],{},[27,1868,1872],{"href":1869,"ariaDescribedBy":1870,"dataFootnoteRef":32,"id":1871},"#user-content-fn-5",[31],"user-content-fnref-5","5"," : utilisé en tant que cross-compilateur, il nous\ngénèrera un exécutable Windows.",[68,1875,1876,1877,1885],{},"Wine",[24,1878,1879],{},[27,1880,1884],{"href":1881,"ariaDescribedBy":1882,"dataFootnoteRef":32,"id":1883},"#user-content-fn-6",[31],"user-content-fnref-6","6"," : Qui nous servira à vérifier l'exécutable créé.",[11,1887,1888],{},"Les différentes étapes de la constitution de ce billet seront :",[65,1890,1891,1894,1897],{},[68,1892,1893],{},"Installation des outils",[68,1895,1896],{},"Compilation d'un programme simple",[68,1898,1899],{},"Compilation d'un programme Qt simple",[206,1901,1893],{"id":1902},"installation-des-outils",[11,1904,1905,1906,1909,1910,1913,1921],{},"Nous y sommes :). Nous allons commencer par installer les outils qui\nnous permettront de faire de la compilation croisée. Sous la\ndistribution de votre choix, il vous faudra donc installer ",[251,1907,1908],{},"mingw"," ainsi\nque ",[251,1911,1912],{},"wine",[24,1914,1915],{},[27,1916,1920],{"href":1917,"ariaDescribedBy":1918,"dataFootnoteRef":32,"id":1919},"#user-content-fn-7",[31],"user-content-fnref-7","7",". Sous une Gnu\u002FDebian, on pourra par exemple faire :",[245,1923,1925],{"className":247,"code":1924,"language":249,"meta":32,"style":32},"> sudo aptitude install mingw32-runtime wine\n",[251,1926,1927],{"__ignoreMap":32},[254,1928,1929],{"class":256,"line":197},[254,1930,1924],{"class":414},[11,1932,1933],{},"Pour vérifier la version actuelle de mingw vous pouvez faire :",[245,1935,1937],{"className":247,"code":1936,"language":249,"meta":32,"style":32},"> i586-mingw32msvc-gcc --version\ni586-mingw32msvc-gcc (GCC) 4.2.1-sjlj (mingw32-2)\nCopyright (C) 2007 Free Software Foundation, Inc.\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n",[251,1938,1939,1944,1958,1966,2009],{"__ignoreMap":32},[254,1940,1941],{"class":256,"line":197},[254,1942,1943],{"class":414},"> i586-mingw32msvc-gcc --version\n",[254,1945,1946,1949,1952,1955],{"class":256,"line":165},[254,1947,1948],{"class":259},"i586-mingw32msvc-gcc",[254,1950,1951],{"class":414}," (GCC) 4.2.1-sjlj (",[254,1953,1954],{"class":259},"mingw32-2",[254,1956,1957],{"class":414},")\n",[254,1959,1960,1963],{"class":256,"line":275},[254,1961,1962],{"class":259},"Copyright",[254,1964,1965],{"class":414}," (C) 2007 Free Software Foundation, Inc.\n",[254,1967,1968,1971,1974,1977,1980,1983,1986,1989,1992,1995,1998,2001,2004,2006],{"class":256,"line":462},[254,1969,1970],{"class":259},"This",[254,1972,1973],{"class":263}," is",[254,1975,1976],{"class":263}," free",[254,1978,1979],{"class":263}," software",[254,1981,1982],{"class":414},"; ",[254,1984,1985],{"class":259},"see",[254,1987,1988],{"class":263}," the",[254,1990,1991],{"class":263}," source",[254,1993,1994],{"class":263}," for",[254,1996,1997],{"class":263}," copying",[254,1999,2000],{"class":263}," conditions.",[254,2002,2003],{"class":263},"  There",[254,2005,1973],{"class":263},[254,2007,2008],{"class":263}," NO\n",[254,2010,2011,2014,2016,2019,2022,2024,2027,2030,2033,2036,2039,2042],{"class":256,"line":490},[254,2012,2013],{"class":259},"warranty",[254,2015,1982],{"class":414},[254,2017,2018],{"class":259},"not",[254,2020,2021],{"class":263}," even",[254,2023,1994],{"class":263},[254,2025,2026],{"class":263}," MERCHANTABILITY",[254,2028,2029],{"class":263}," or",[254,2031,2032],{"class":263}," FITNESS",[254,2034,2035],{"class":263}," FOR",[254,2037,2038],{"class":263}," A",[254,2040,2041],{"class":263}," PARTICULAR",[254,2043,2044],{"class":263}," PURPOSE.\n",[206,2046,1896],{"id":2047},"compilation-dun-programme-simple",[11,2049,2050],{},"Commençons par le programme le plus simple du monde:",[245,2052,2054],{"className":398,"code":2053,"language":400,"meta":32,"style":32},"#include \u003Ciostream>\n\nint main(int argc, char** argv)\n{\n    std::cout \u003C\u003C \"Hello\" \u003C\u003C std::endl;\n    return 0;\n}\n",[251,2055,2056,2064,2068,2093,2098,2115,2126],{"__ignoreMap":32},[254,2057,2058,2061],{"class":256,"line":197},[254,2059,2060],{"class":407},"#include",[254,2062,2063],{"class":263}," \u003Ciostream>\n",[254,2065,2066],{"class":256,"line":165},[254,2067,459],{"emptyLinePlaceholder":190},[254,2069,2070,2073,2076,2078,2080,2083,2085,2088,2091],{"class":256,"line":275},[254,2071,2072],{"class":407},"int",[254,2074,2075],{"class":259}," main",[254,2077,415],{"class":414},[254,2079,2072],{"class":407},[254,2081,2082],{"class":431}," argc",[254,2084,435],{"class":414},[254,2086,2087],{"class":407},"char**",[254,2089,2090],{"class":431}," argv",[254,2092,1957],{"class":414},[254,2094,2095],{"class":256,"line":462},[254,2096,2097],{"class":414},"{\n",[254,2099,2100,2103,2106,2109,2112],{"class":256,"line":490},[254,2101,2102],{"class":414},"    std::cout ",[254,2104,2105],{"class":407},"\u003C\u003C",[254,2107,2108],{"class":263}," \"Hello\"",[254,2110,2111],{"class":407}," \u003C\u003C",[254,2113,2114],{"class":414}," std::endl;\n",[254,2116,2117,2120,2123],{"class":256,"line":512},[254,2118,2119],{"class":407},"    return",[254,2121,2122],{"class":300}," 0",[254,2124,2125],{"class":414},";\n",[254,2127,2128],{"class":256,"line":517},[254,2129,1595],{"class":414},[11,2131,2132],{},"Puis compilons :",[245,2134,2136],{"className":247,"code":2135,"language":249,"meta":32,"style":32},"> i586-mingw32msvc-g++ -o test.exe test.cpp\n> ls\ntest.c\ntest.exe\n> file test.exe\ntest.exe: PE32 executable (console) Intel 80386, for MS Windows\n",[251,2137,2138,2143,2148,2156,2163,2168],{"__ignoreMap":32},[254,2139,2140],{"class":256,"line":197},[254,2141,2142],{"class":414},"> i586-mingw32msvc-g++ -o test.exe test.cpp\n",[254,2144,2145],{"class":256,"line":165},[254,2146,2147],{"class":414},"> ls\n",[254,2149,2150,2153],{"class":256,"line":275},[254,2151,2152],{"class":269},"test",[254,2154,2155],{"class":263},".c\n",[254,2157,2158,2160],{"class":256,"line":462},[254,2159,2152],{"class":269},[254,2161,2162],{"class":263},".exe\n",[254,2164,2165],{"class":256,"line":490},[254,2166,2167],{"class":414},"> file test.exe\n",[254,2169,2170,2172,2175,2178,2181,2184,2187],{"class":256,"line":512},[254,2171,2152],{"class":269},[254,2173,2174],{"class":263},".exe:",[254,2176,2177],{"class":263}," PE32",[254,2179,2180],{"class":263}," executable",[254,2182,2183],{"class":414}," (console) Intel 80386, ",[254,2185,2186],{"class":407},"for",[254,2188,2189],{"class":414}," MS Windows\n",[11,2191,2192],{},"Voilà nous avons donc un programme à destination de Windows. Il ne nous\nreste plus qu'à le tester :",[245,2194,2196],{"className":247,"code":2195,"language":249,"meta":32,"style":32},"> wine .\u002Ftest.exe\nHello\n",[251,2197,2198,2203],{"__ignoreMap":32},[254,2199,2200],{"class":256,"line":197},[254,2201,2202],{"class":414},"> wine .\u002Ftest.exe\n",[254,2204,2205],{"class":256,"line":165},[254,2206,2207],{"class":259},"Hello\n",[11,2209,2210],{},"Et voilà, nous avons écrit un petit programme Windows, et nous l'avons\ntesté à l'aide de Wine. Généralement, on utilise l'utilisation de\nMakefile, voir même des générateurs de Makefile. Nous allons compléter\nl'exemple avec CMake. Voici donc un exemple de fichier CMake :",[245,2212,2215],{"className":2213,"code":2214,"language":912,"meta":32,"style":32},"language-cmake shiki shiki-themes one-dark-pro","project(test)\nadd_executable(test test.cpp)\n",[251,2216,2217,2228],{"__ignoreMap":32},[254,2218,2219,2222,2224,2226],{"class":256,"line":197},[254,2220,2221],{"class":407},"project",[254,2223,415],{"class":414},[254,2225,2152],{"class":407},[254,2227,1957],{"class":414},[254,2229,2230,2233,2235,2237,2240],{"class":256,"line":165},[254,2231,2232],{"class":407},"add_executable",[254,2234,415],{"class":414},[254,2236,2152],{"class":407},[254,2238,2239],{"class":407}," test",[254,2241,2242],{"class":414},".cpp)\n",[11,2244,2245],{},"Nous allons donc lancer la compilation, sous Linux :",[245,2247,2249],{"className":247,"code":2248,"language":249,"meta":32,"style":32},"> mkdir build\n> cd build\n> cmake ..\u002F\n-- The C compiler identification is GNU\n-- The CXX compiler identification is GNU\n-- Check for working C compiler: \u002Fusr\u002Flib\u002Fccache\u002Fgcc\n-- Check for working C compiler: \u002Fusr\u002Flib\u002Fccache\u002Fgcc -- works\n-- Detecting C compiler ABI info\n-- Detecting C compiler ABI info - done\n-- Check for working CXX compiler: \u002Fusr\u002Flib\u002Fccache\u002Fc++\n-- Check for working CXX compiler: \u002Fusr\u002Flib\u002Fccache\u002Fc++ -- works\n-- Detecting CXX compiler ABI info\n-- Detecting CXX compiler ABI info - done\n-- Configuring done\n-- Generating done\n-- Build files have been written to: \u002Ftmp\u002Fbuild\n> make\nScanning dependencies of target test\n[100%] Building CXX object CMakeFiles\u002Ftest.dir\u002Ftest.cpp.o\nLinking CXX executable test\n\n[100%] Built target test\n> file test\ntest: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU\u002FLinux 2.6.26, BuildID[sha1]=0xf17337fcecb8f3b6ed589d8dce8978be08f2caca, not stripped\n",[251,2250,2251,2256,2261,2266,2288,2305,2325,2348,2365,2386,2403,2424,2438,2456,2465,2474,2499,2504,2521,2526,2537,2541,2546,2551],{"__ignoreMap":32},[254,2252,2253],{"class":256,"line":197},[254,2254,2255],{"class":414},"> mkdir build\n",[254,2257,2258],{"class":256,"line":165},[254,2259,2260],{"class":414},"> cd build\n",[254,2262,2263],{"class":256,"line":275},[254,2264,2265],{"class":414},"> cmake ..\u002F\n",[254,2267,2268,2271,2274,2277,2280,2283,2285],{"class":256,"line":462},[254,2269,2270],{"class":259},"--",[254,2272,2273],{"class":263}," The",[254,2275,2276],{"class":263}," C",[254,2278,2279],{"class":263}," compiler",[254,2281,2282],{"class":263}," identification",[254,2284,1973],{"class":263},[254,2286,2287],{"class":263}," GNU\n",[254,2289,2290,2292,2294,2297,2299,2301,2303],{"class":256,"line":490},[254,2291,2270],{"class":259},[254,2293,2273],{"class":263},[254,2295,2296],{"class":263}," CXX",[254,2298,2279],{"class":263},[254,2300,2282],{"class":263},[254,2302,1973],{"class":263},[254,2304,2287],{"class":263},[254,2306,2307,2309,2312,2314,2317,2319,2322],{"class":256,"line":512},[254,2308,2270],{"class":259},[254,2310,2311],{"class":263}," Check",[254,2313,1994],{"class":263},[254,2315,2316],{"class":263}," working",[254,2318,2276],{"class":263},[254,2320,2321],{"class":263}," compiler:",[254,2323,2324],{"class":263}," \u002Fusr\u002Flib\u002Fccache\u002Fgcc\n",[254,2326,2327,2329,2331,2333,2335,2337,2339,2342,2345],{"class":256,"line":517},[254,2328,2270],{"class":259},[254,2330,2311],{"class":263},[254,2332,1994],{"class":263},[254,2334,2316],{"class":263},[254,2336,2276],{"class":263},[254,2338,2321],{"class":263},[254,2340,2341],{"class":263}," \u002Fusr\u002Flib\u002Fccache\u002Fgcc",[254,2343,2344],{"class":300}," --",[254,2346,2347],{"class":263}," works\n",[254,2349,2350,2352,2355,2357,2359,2362],{"class":256,"line":523},[254,2351,2270],{"class":259},[254,2353,2354],{"class":263}," Detecting",[254,2356,2276],{"class":263},[254,2358,2279],{"class":263},[254,2360,2361],{"class":263}," ABI",[254,2363,2364],{"class":263}," info\n",[254,2366,2367,2369,2371,2373,2375,2377,2380,2383],{"class":256,"line":538},[254,2368,2270],{"class":259},[254,2370,2354],{"class":263},[254,2372,2276],{"class":263},[254,2374,2279],{"class":263},[254,2376,2361],{"class":263},[254,2378,2379],{"class":263}," info",[254,2381,2382],{"class":263}," -",[254,2384,2385],{"class":263}," done\n",[254,2387,2388,2390,2392,2394,2396,2398,2400],{"class":256,"line":555},[254,2389,2270],{"class":259},[254,2391,2311],{"class":263},[254,2393,1994],{"class":263},[254,2395,2316],{"class":263},[254,2397,2296],{"class":263},[254,2399,2321],{"class":263},[254,2401,2402],{"class":263}," \u002Fusr\u002Flib\u002Fccache\u002Fc++\n",[254,2404,2405,2407,2409,2411,2413,2415,2417,2420,2422],{"class":256,"line":578},[254,2406,2270],{"class":259},[254,2408,2311],{"class":263},[254,2410,1994],{"class":263},[254,2412,2316],{"class":263},[254,2414,2296],{"class":263},[254,2416,2321],{"class":263},[254,2418,2419],{"class":263}," \u002Fusr\u002Flib\u002Fccache\u002Fc++",[254,2421,2344],{"class":300},[254,2423,2347],{"class":263},[254,2425,2426,2428,2430,2432,2434,2436],{"class":256,"line":583},[254,2427,2270],{"class":259},[254,2429,2354],{"class":263},[254,2431,2296],{"class":263},[254,2433,2279],{"class":263},[254,2435,2361],{"class":263},[254,2437,2364],{"class":263},[254,2439,2440,2442,2444,2446,2448,2450,2452,2454],{"class":256,"line":599},[254,2441,2270],{"class":259},[254,2443,2354],{"class":263},[254,2445,2296],{"class":263},[254,2447,2279],{"class":263},[254,2449,2361],{"class":263},[254,2451,2379],{"class":263},[254,2453,2382],{"class":263},[254,2455,2385],{"class":263},[254,2457,2458,2460,2463],{"class":256,"line":604},[254,2459,2270],{"class":259},[254,2461,2462],{"class":263}," Configuring",[254,2464,2385],{"class":263},[254,2466,2467,2469,2472],{"class":256,"line":667},[254,2468,2270],{"class":259},[254,2470,2471],{"class":263}," Generating",[254,2473,2385],{"class":263},[254,2475,2476,2478,2481,2484,2487,2490,2493,2496],{"class":256,"line":672},[254,2477,2270],{"class":259},[254,2479,2480],{"class":263}," Build",[254,2482,2483],{"class":263}," files",[254,2485,2486],{"class":263}," have",[254,2488,2489],{"class":263}," been",[254,2491,2492],{"class":263}," written",[254,2494,2495],{"class":263}," to:",[254,2497,2498],{"class":263}," \u002Ftmp\u002Fbuild\n",[254,2500,2501],{"class":256,"line":702},[254,2502,2503],{"class":414},"> make\n",[254,2505,2506,2509,2512,2515,2518],{"class":256,"line":728},[254,2507,2508],{"class":259},"Scanning",[254,2510,2511],{"class":263}," dependencies",[254,2513,2514],{"class":263}," of",[254,2516,2517],{"class":263}," target",[254,2519,2520],{"class":263}," test\n",[254,2522,2523],{"class":256,"line":740},[254,2524,2525],{"class":414},"[100%] Building CXX object CMakeFiles\u002Ftest.dir\u002Ftest.cpp.o\n",[254,2527,2528,2531,2533,2535],{"class":256,"line":789},[254,2529,2530],{"class":259},"Linking",[254,2532,2296],{"class":263},[254,2534,2180],{"class":263},[254,2536,2520],{"class":263},[254,2538,2539],{"class":256,"line":827},[254,2540,459],{"emptyLinePlaceholder":190},[254,2542,2543],{"class":256,"line":835},[254,2544,2545],{"class":414},"[100%] Built target test\n",[254,2547,2548],{"class":256,"line":1460},[254,2549,2550],{"class":414},"> file test\n",[254,2552,2553,2555,2558,2561,2564,2567,2570,2573,2576,2579,2581,2584,2587,2590,2593,2595,2597],{"class":256,"line":1483},[254,2554,2152],{"class":269},[254,2556,2557],{"class":263},":",[254,2559,2560],{"class":263}," ELF",[254,2562,2563],{"class":263}," 32-bit",[254,2565,2566],{"class":263}," LSB",[254,2568,2569],{"class":263}," executable,",[254,2571,2572],{"class":263}," Intel",[254,2574,2575],{"class":263}," 80386,",[254,2577,2578],{"class":263}," version",[254,2580,684],{"class":300},[254,2582,2583],{"class":414}," (SYSV), dynamically linked (",[254,2585,2586],{"class":259},"uses",[254,2588,2589],{"class":263}," shared",[254,2591,2592],{"class":263}," libs",[254,2594,1344],{"class":414},[254,2596,2186],{"class":407},[254,2598,2599],{"class":414}," GNU\u002FLinux 2.6.26, BuildID[sha1]=0xf17337fcecb8f3b6ed589d8dce8978be08f2caca, not stripped\n",[11,2601,2602],{},"Nous avons donc un binaire pour Gnu\u002FLinux. Recommençons donc mais avec\nWindows :",[245,2604,2606],{"className":247,"code":2605,"language":249,"meta":32,"style":32},"> cmake -DCMAKE_C_COMPILER=i586-mingw32msvc-gcc -DCMAKE_CXX_COMPILER=i586-mingw32msvc-g++ ..\u002F\n-- The C compiler identification is GNU\n-- The CXX compiler identification is GNU\n-- Check for working C compiler: \u002Fusr\u002Flib\u002Fccache\u002Fi586-mingw32msvc-gcc\n-- Check for working C compiler: \u002Fusr\u002Flib\u002Fccache\u002Fi586-mingw32msvc-gcc -- works\n-- Detecting C compiler ABI info\n-- Detecting C compiler ABI info - done\n-- Check for working CXX compiler: \u002Fusr\u002Flib\u002Fccache\u002Fi586-mingw32msvc-g++\n-- Check for working CXX compiler: \u002Fusr\u002Flib\u002Fccache\u002Fi586-mingw32msvc-g++ -- works\n-- Detecting CXX compiler ABI info\n-- Detecting CXX compiler ABI info - done\n-- Configuring done\n-- Generating done\n-- Build files have been written to: \u002Ftmp\u002Fbuild-windows\n> make\nScanning dependencies of target test\n[100%] Building CXX object CMakeFiles\u002Ftest.dir\u002Ftest.cpp.o\n\nLinking CXX executable test\n[100%] Built target test\n> file test\ntest: PE32 executable (console) Intel 80386, for MS Windows\n",[251,2607,2608,2634,2650,2666,2683,2704,2718,2736,2753,2774,2788,2806,2814,2822,2841,2845,2857,2861,2865,2875,2879,2883],{"__ignoreMap":32},[254,2609,2610,2613,2616,2618,2620,2623,2625,2628,2631],{"class":256,"line":197},[254,2611,2612],{"class":414},"> cmake ",[254,2614,2615],{"class":620},"-DCMAKE_C_COMPILER",[254,2617,561],{"class":269},[254,2619,1948],{"class":263},[254,2621,2622],{"class":620}," -DCMAKE_CXX_COMPILER",[254,2624,561],{"class":269},[254,2626,2627],{"class":263},"i586-mingw32msvc-g++",[254,2629,2630],{"class":269}," .",[254,2632,2633],{"class":263},".\u002F\n",[254,2635,2636,2638,2640,2642,2644,2646,2648],{"class":256,"line":165},[254,2637,2270],{"class":259},[254,2639,2273],{"class":263},[254,2641,2276],{"class":263},[254,2643,2279],{"class":263},[254,2645,2282],{"class":263},[254,2647,1973],{"class":263},[254,2649,2287],{"class":263},[254,2651,2652,2654,2656,2658,2660,2662,2664],{"class":256,"line":275},[254,2653,2270],{"class":259},[254,2655,2273],{"class":263},[254,2657,2296],{"class":263},[254,2659,2279],{"class":263},[254,2661,2282],{"class":263},[254,2663,1973],{"class":263},[254,2665,2287],{"class":263},[254,2667,2668,2670,2672,2674,2676,2678,2680],{"class":256,"line":462},[254,2669,2270],{"class":259},[254,2671,2311],{"class":263},[254,2673,1994],{"class":263},[254,2675,2316],{"class":263},[254,2677,2276],{"class":263},[254,2679,2321],{"class":263},[254,2681,2682],{"class":263}," \u002Fusr\u002Flib\u002Fccache\u002Fi586-mingw32msvc-gcc\n",[254,2684,2685,2687,2689,2691,2693,2695,2697,2700,2702],{"class":256,"line":490},[254,2686,2270],{"class":259},[254,2688,2311],{"class":263},[254,2690,1994],{"class":263},[254,2692,2316],{"class":263},[254,2694,2276],{"class":263},[254,2696,2321],{"class":263},[254,2698,2699],{"class":263}," \u002Fusr\u002Flib\u002Fccache\u002Fi586-mingw32msvc-gcc",[254,2701,2344],{"class":300},[254,2703,2347],{"class":263},[254,2705,2706,2708,2710,2712,2714,2716],{"class":256,"line":512},[254,2707,2270],{"class":259},[254,2709,2354],{"class":263},[254,2711,2276],{"class":263},[254,2713,2279],{"class":263},[254,2715,2361],{"class":263},[254,2717,2364],{"class":263},[254,2719,2720,2722,2724,2726,2728,2730,2732,2734],{"class":256,"line":517},[254,2721,2270],{"class":259},[254,2723,2354],{"class":263},[254,2725,2276],{"class":263},[254,2727,2279],{"class":263},[254,2729,2361],{"class":263},[254,2731,2379],{"class":263},[254,2733,2382],{"class":263},[254,2735,2385],{"class":263},[254,2737,2738,2740,2742,2744,2746,2748,2750],{"class":256,"line":523},[254,2739,2270],{"class":259},[254,2741,2311],{"class":263},[254,2743,1994],{"class":263},[254,2745,2316],{"class":263},[254,2747,2296],{"class":263},[254,2749,2321],{"class":263},[254,2751,2752],{"class":263}," \u002Fusr\u002Flib\u002Fccache\u002Fi586-mingw32msvc-g++\n",[254,2754,2755,2757,2759,2761,2763,2765,2767,2770,2772],{"class":256,"line":538},[254,2756,2270],{"class":259},[254,2758,2311],{"class":263},[254,2760,1994],{"class":263},[254,2762,2316],{"class":263},[254,2764,2296],{"class":263},[254,2766,2321],{"class":263},[254,2768,2769],{"class":263}," \u002Fusr\u002Flib\u002Fccache\u002Fi586-mingw32msvc-g++",[254,2771,2344],{"class":300},[254,2773,2347],{"class":263},[254,2775,2776,2778,2780,2782,2784,2786],{"class":256,"line":555},[254,2777,2270],{"class":259},[254,2779,2354],{"class":263},[254,2781,2296],{"class":263},[254,2783,2279],{"class":263},[254,2785,2361],{"class":263},[254,2787,2364],{"class":263},[254,2789,2790,2792,2794,2796,2798,2800,2802,2804],{"class":256,"line":578},[254,2791,2270],{"class":259},[254,2793,2354],{"class":263},[254,2795,2296],{"class":263},[254,2797,2279],{"class":263},[254,2799,2361],{"class":263},[254,2801,2379],{"class":263},[254,2803,2382],{"class":263},[254,2805,2385],{"class":263},[254,2807,2808,2810,2812],{"class":256,"line":583},[254,2809,2270],{"class":259},[254,2811,2462],{"class":263},[254,2813,2385],{"class":263},[254,2815,2816,2818,2820],{"class":256,"line":599},[254,2817,2270],{"class":259},[254,2819,2471],{"class":263},[254,2821,2385],{"class":263},[254,2823,2824,2826,2828,2830,2832,2834,2836,2838],{"class":256,"line":604},[254,2825,2270],{"class":259},[254,2827,2480],{"class":263},[254,2829,2483],{"class":263},[254,2831,2486],{"class":263},[254,2833,2489],{"class":263},[254,2835,2492],{"class":263},[254,2837,2495],{"class":263},[254,2839,2840],{"class":263}," \u002Ftmp\u002Fbuild-windows\n",[254,2842,2843],{"class":256,"line":667},[254,2844,2503],{"class":414},[254,2846,2847,2849,2851,2853,2855],{"class":256,"line":672},[254,2848,2508],{"class":259},[254,2850,2511],{"class":263},[254,2852,2514],{"class":263},[254,2854,2517],{"class":263},[254,2856,2520],{"class":263},[254,2858,2859],{"class":256,"line":702},[254,2860,2525],{"class":414},[254,2862,2863],{"class":256,"line":728},[254,2864,459],{"emptyLinePlaceholder":190},[254,2866,2867,2869,2871,2873],{"class":256,"line":740},[254,2868,2530],{"class":259},[254,2870,2296],{"class":263},[254,2872,2180],{"class":263},[254,2874,2520],{"class":263},[254,2876,2877],{"class":256,"line":789},[254,2878,2545],{"class":414},[254,2880,2881],{"class":256,"line":827},[254,2882,2550],{"class":414},[254,2884,2885,2887,2889,2891,2893,2895,2897],{"class":256,"line":835},[254,2886,2152],{"class":269},[254,2888,2557],{"class":263},[254,2890,2177],{"class":263},[254,2892,2180],{"class":263},[254,2894,2183],{"class":414},[254,2896,2186],{"class":407},[254,2898,2189],{"class":414},[11,2900,2901],{},"Nous avons donc maintenant la possibilité de compiler notre application\nmulti-platformes depuis Linux pour les systèmes Linux, mais aussi pour\nles systèmes Windows.",[206,2903,2905],{"id":2904},"compilation-dun-programme-écrit-avec-qt","Compilation d'un programme écrit avec Qt",[11,2907,2908],{},"Nous allons maintenant nous compliquer un peu la tâche en compilant un\nprogramme ayant une dépendance avec une librairie externe : Qt. Qt est\nun framework proposant une boîte à outil de classe permettant de faire\ndes interfaces graphiques mais aussi de faire des applications consoles\nrapidement.",[11,2910,2911],{},"Nous allons donc écrire le petit programme suivant, qui affiche une\nboîte de dialogue inutile, avec un bouton inutile :",[245,2913,2915],{"className":398,"code":2914,"language":400,"meta":32,"style":32},"#include \u003CQApplication>\n#include \u003CQPushButton>\n\nint main(int argc, char** argv)\n{\n    QApplication app(argc, argv);\n    QPushButton * btn = new QPushButton(\"Do nothing\");\n    btn->show();\n\n    return app.exec();\n}\n",[251,2916,2917,2924,2931,2935,2955,2959,2970,2995,3008,3012,3026],{"__ignoreMap":32},[254,2918,2919,2921],{"class":256,"line":197},[254,2920,2060],{"class":407},[254,2922,2923],{"class":263}," \u003CQApplication>\n",[254,2925,2926,2928],{"class":256,"line":165},[254,2927,2060],{"class":407},[254,2929,2930],{"class":263}," \u003CQPushButton>\n",[254,2932,2933],{"class":256,"line":275},[254,2934,459],{"emptyLinePlaceholder":190},[254,2936,2937,2939,2941,2943,2945,2947,2949,2951,2953],{"class":256,"line":462},[254,2938,2072],{"class":407},[254,2940,2075],{"class":259},[254,2942,415],{"class":414},[254,2944,2072],{"class":407},[254,2946,2082],{"class":431},[254,2948,435],{"class":414},[254,2950,2087],{"class":407},[254,2952,2090],{"class":431},[254,2954,1957],{"class":414},[254,2956,2957],{"class":256,"line":490},[254,2958,2097],{"class":414},[254,2960,2961,2964,2967],{"class":256,"line":512},[254,2962,2963],{"class":414},"    QApplication ",[254,2965,2966],{"class":259},"app",[254,2968,2969],{"class":414},"(argc, argv);\n",[254,2971,2972,2975,2977,2980,2982,2985,2988,2990,2993],{"class":256,"line":517},[254,2973,2974],{"class":414},"    QPushButton ",[254,2976,775],{"class":407},[254,2978,2979],{"class":414}," btn ",[254,2981,561],{"class":407},[254,2983,2984],{"class":407}," new",[254,2986,2987],{"class":259}," QPushButton",[254,2989,415],{"class":414},[254,2991,2992],{"class":263},"\"Do nothing\"",[254,2994,1370],{"class":414},[254,2996,2997,3000,3003,3006],{"class":256,"line":523},[254,2998,2999],{"class":424},"    btn",[254,3001,3002],{"class":414},"->",[254,3004,3005],{"class":259},"show",[254,3007,725],{"class":414},[254,3009,3010],{"class":256,"line":538},[254,3011,459],{"emptyLinePlaceholder":190},[254,3013,3014,3016,3019,3021,3024],{"class":256,"line":555},[254,3015,2119],{"class":407},[254,3017,3018],{"class":424}," app",[254,3020,35],{"class":414},[254,3022,3023],{"class":259},"exec",[254,3025,725],{"class":414},[254,3027,3028],{"class":256,"line":578},[254,3029,1595],{"class":414},[11,3031,3032,3033,3036],{},"Avec le fichier ",[251,3034,3035],{},"qmake"," associé tout simple :",[245,3038,3042],{"className":3039,"code":3040,"language":3041,"meta":32,"style":32},"language-ini shiki shiki-themes one-dark-pro","[qmake]\nTEMPLATE = app\nTARGET =\nDEPENDPATH += .\nINCLUDEPATH += .\n\n# Input\nSOURCES += test.cpp\n","ini",[251,3043,3044,3049,3060,3068,3073,3078,3082,3087],{"__ignoreMap":32},[254,3045,3046],{"class":256,"line":197},[254,3047,3048],{"class":259},"[qmake]\n",[254,3050,3051,3054,3057],{"class":256,"line":165},[254,3052,3053],{"class":407},"TEMPLATE",[254,3055,3056],{"class":414}," =",[254,3058,3059],{"class":263}," app\n",[254,3061,3062,3065],{"class":256,"line":275},[254,3063,3064],{"class":407},"TARGET",[254,3066,3067],{"class":414}," =\n",[254,3069,3070],{"class":256,"line":462},[254,3071,3072],{"class":263},"DEPENDPATH += .\n",[254,3074,3075],{"class":256,"line":490},[254,3076,3077],{"class":263},"INCLUDEPATH += .\n",[254,3079,3080],{"class":256,"line":512},[254,3081,459],{"emptyLinePlaceholder":190},[254,3083,3084],{"class":256,"line":517},[254,3085,3086],{"class":534},"# Input\n",[254,3088,3089],{"class":256,"line":523},[254,3090,3091],{"class":263},"SOURCES += test.cpp\n",[11,3093,3094,3095,3098],{},"On test la compilation à l'aide de ",[251,3096,3097],{},"qmake ; make"," et on lance le\nprogramme :",[11,3100,3101],{},[42,3102],{"alt":3103,"src":3104},"cross-compil1","\u002FProgrammation\u002Fcross-compilation-compiler-un-programme-pour-ms-windows-sous-gnu-linux\u002Fcross-compil1.png",[11,3106,3107],{},"Maintenant que notre programme compile et fonctionne sous Gnu\u002FLinux,\nnous allons pouvoir faire le même test mais en compilant une version\nWindows. Pour cela, il va nous falloir la version Windows de Qt (nous\nn'allons pas compiler Qt, alors que la librairie existe déjà).",[11,3109,3110,3111,3115],{},"Vous pouvez commencer par télécharger la dernière version de Qt (ou\ncelle qui vous convient) à l'adresse suivante\n",[27,3112,3113],{"href":3113,"rel":3114},"http:\u002F\u002Fqt.nokia.com\u002Fproducts\u002F",[155]," et l'installer. Vous n'avez pas besoin\nde MinGW, ni de QtCreator. Vous pouvez donc télécharger directement la\nversion qui ne contient que la librairie.",[11,3117,3118],{},[42,3119],{"alt":3120,"src":3121},"cross-compil3","\u002FProgrammation\u002Fcross-compilation-compiler-un-programme-pour-ms-windows-sous-gnu-linux\u002Fcross-compil3.png",[11,3123,3124],{},"Si à l'installation, l'application demande l'installation ou\nl'emplacement de MinGW, vous n'avez pas besoin de le renseigner, nous\nutiliserons la version Linux de MinGW.",[11,3126,3127],{},[42,3128],{"alt":3129,"src":3130},"cross-compil2","\u002FProgrammation\u002Fcross-compilation-compiler-un-programme-pour-ms-windows-sous-gnu-linux\u002Fcross-compil2.png",[11,3132,3133],{},"Enfin nous allons faire un peu de paramétrage. Nous allons récupérer le\ndossier de specs Qt pour windows et l'adapter pour MinGW sous Linux. Les\nadaptations à faire sont :",[65,3135,3136,3139,3142],{},[68,3137,3138],{},"Utilisation de MinGW",[68,3140,3141],{},"Définition des dossiers de Qt Windows et MinGW",[68,3143,3144],{},"Suppression de l'extension .exe",[11,3146,3147],{},"Commençons par créer le fichier qmake.conf :",[245,3149,3151],{"className":247,"code":3150,"language":249,"meta":32,"style":32},"sudo cp -Rf \u002Fusr\u002Fshare\u002Fqt4\u002Fmkspecs\u002Fwin32-g++ \u002Fusr\u002Fshare\u002Fqt4\u002Fmkspecs\u002Fwin32-x-g++\nsudo nano \u002Fusr\u002Fshare\u002Fqt4\u002Fmkspecs\u002Fwin32-x-g++\u002Fqmake.conf\n",[251,3152,3153,3170],{"__ignoreMap":32},[254,3154,3155,3158,3161,3164,3167],{"class":256,"line":197},[254,3156,3157],{"class":259},"sudo",[254,3159,3160],{"class":263}," cp",[254,3162,3163],{"class":300}," -Rf",[254,3165,3166],{"class":263}," \u002Fusr\u002Fshare\u002Fqt4\u002Fmkspecs\u002Fwin32-g++",[254,3168,3169],{"class":263}," \u002Fusr\u002Fshare\u002Fqt4\u002Fmkspecs\u002Fwin32-x-g++\n",[254,3171,3172,3174,3177],{"class":256,"line":165},[254,3173,3157],{"class":259},[254,3175,3176],{"class":263}," nano",[254,3178,3179],{"class":263}," \u002Fusr\u002Fshare\u002Fqt4\u002Fmkspecs\u002Fwin32-x-g++\u002Fqmake.conf\n",[11,3181,3182,3183,3191],{},"Voici le fichier de diff",[24,3184,3185],{},[27,3186,3190],{"href":3187,"ariaDescribedBy":3188,"dataFootnoteRef":32,"id":3189},"#user-content-fn-8",[31],"user-content-fnref-8","8"," qui contient les choses à modifier, vous pouvez\nle récupérer et utiliser la commande patch pour reporter les\nmodifications, ou faire les modifications à la mains :",[245,3193,3197],{"className":3194,"code":3195,"language":3196,"meta":32,"style":32},"language-diff shiki shiki-themes one-dark-pro","17c17\n\u003C QMAKE_CC              = gcc\n---\n> QMAKE_CC              = i586-mingw32msvc-gcc\n30c30\n\u003C QMAKE_CXX             = g++\n---\n> QMAKE_CXX             = i586-mingw32msvc-g++\n44,46c44,46\n\u003C QMAKE_INCDIR          =\n\u003C QMAKE_INCDIR_QT               = $$[QT_INSTALL_HEADERS]\n\u003C QMAKE_LIBDIR_QT               = $$[QT_INSTALL_LIBS]\n---\n> QMAKE_INCDIR          = \u002Fusr\u002Fi586-mingw32msvc\u002Finclude\n> QMAKE_INCDIR_QT               = \u002Fhome\u002Fphoenix\u002F.wine\u002Fdrive_c\u002FQt\u002F4.8.2\u002Finclude\n> QMAKE_LIBDIR_QT               = \u002Fhome\u002Fphoenix\u002F.wine\u002Fdrive_c\u002FQt\u002F4.8.2\u002Flib\n53,54c53,54\n\u003C QMAKE_LINK            = g++\n\u003C QMAKE_LINK_C          = gcc\n---\n> QMAKE_LINK            = i586-mingw32msvc-g++\n> QMAKE_LINK_C          = i586-mingw32msvc-gcc\n77c77\n\u003C !isEmpty(QMAKE_SH) {\n---\n> #!isEmpty(QMAKE_SH) {\n88,100c88,100\n\u003C } else {\n\u003C       QMAKE_COPY              = copy \u002Fy\n\u003C       QMAKE_COPY_DIR          = xcopy \u002Fs \u002Fq \u002Fy \u002Fi\n\u003C       QMAKE_MOVE              = move\n\u003C       QMAKE_DEL_FILE          = del\n\u003C       QMAKE_MKDIR             = mkdir\n\u003C       QMAKE_DEL_DIR           = rmdir\n\u003C     QMAKE_CHK_DIR_EXISTS      = if not exist\n\u003C }\n\u003C\n\u003C QMAKE_MOC             = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}moc.exe\n\u003C QMAKE_UIC             = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}uic.exe\n\u003C QMAKE_IDC             = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}idc.exe\n---\n> #} else {\n> #     QMAKE_COPY              = copy \u002Fy\n> #     QMAKE_COPY_DIR          = xcopy \u002Fs \u002Fq \u002Fy \u002Fi\n> #     QMAKE_MOVE              = move\n> #     QMAKE_DEL_FILE          = del\n> #     QMAKE_MKDIR             = mkdir\n> #     QMAKE_DEL_DIR           = rmdir\n> #    QMAKE_CHK_DIR_EXISTS     = if not exist\n> #}\n>\n> QMAKE_MOC             = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}moc-qt4\n> QMAKE_UIC             = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}uic-qt4\n> QMAKE_IDC             = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}idc-qt4\n","diff",[251,3198,3199,3204,3209,3214,3219,3224,3229,3233,3238,3243,3248,3253,3258,3262,3267,3272,3277,3282,3287,3292,3296,3301,3306,3311,3316,3320,3325,3330,3335,3340,3345,3351,3357,3363,3369,3375,3381,3387,3393,3399,3405,3410,3416,3422,3428,3434,3440,3446,3452,3458,3464,3470,3476,3482],{"__ignoreMap":32},[254,3200,3201],{"class":256,"line":197},[254,3202,3203],{"class":414},"17c17\n",[254,3205,3206],{"class":256,"line":165},[254,3207,3208],{"class":620},"\u003C QMAKE_CC              = gcc\n",[254,3210,3211],{"class":256,"line":275},[254,3212,3213],{"class":414},"---\n",[254,3215,3216],{"class":256,"line":462},[254,3217,3218],{"class":263},"> QMAKE_CC              = i586-mingw32msvc-gcc\n",[254,3220,3221],{"class":256,"line":490},[254,3222,3223],{"class":414},"30c30\n",[254,3225,3226],{"class":256,"line":512},[254,3227,3228],{"class":620},"\u003C QMAKE_CXX             = g++\n",[254,3230,3231],{"class":256,"line":517},[254,3232,3213],{"class":414},[254,3234,3235],{"class":256,"line":523},[254,3236,3237],{"class":263},"> QMAKE_CXX             = i586-mingw32msvc-g++\n",[254,3239,3240],{"class":256,"line":538},[254,3241,3242],{"class":414},"44,46c44,46\n",[254,3244,3245],{"class":256,"line":555},[254,3246,3247],{"class":620},"\u003C QMAKE_INCDIR          =\n",[254,3249,3250],{"class":256,"line":578},[254,3251,3252],{"class":620},"\u003C QMAKE_INCDIR_QT               = $$[QT_INSTALL_HEADERS]\n",[254,3254,3255],{"class":256,"line":583},[254,3256,3257],{"class":620},"\u003C QMAKE_LIBDIR_QT               = $$[QT_INSTALL_LIBS]\n",[254,3259,3260],{"class":256,"line":599},[254,3261,3213],{"class":414},[254,3263,3264],{"class":256,"line":604},[254,3265,3266],{"class":263},"> QMAKE_INCDIR          = \u002Fusr\u002Fi586-mingw32msvc\u002Finclude\n",[254,3268,3269],{"class":256,"line":667},[254,3270,3271],{"class":263},"> QMAKE_INCDIR_QT               = \u002Fhome\u002Fphoenix\u002F.wine\u002Fdrive_c\u002FQt\u002F4.8.2\u002Finclude\n",[254,3273,3274],{"class":256,"line":672},[254,3275,3276],{"class":263},"> QMAKE_LIBDIR_QT               = \u002Fhome\u002Fphoenix\u002F.wine\u002Fdrive_c\u002FQt\u002F4.8.2\u002Flib\n",[254,3278,3279],{"class":256,"line":702},[254,3280,3281],{"class":414},"53,54c53,54\n",[254,3283,3284],{"class":256,"line":728},[254,3285,3286],{"class":620},"\u003C QMAKE_LINK            = g++\n",[254,3288,3289],{"class":256,"line":740},[254,3290,3291],{"class":620},"\u003C QMAKE_LINK_C          = gcc\n",[254,3293,3294],{"class":256,"line":789},[254,3295,3213],{"class":414},[254,3297,3298],{"class":256,"line":827},[254,3299,3300],{"class":263},"> QMAKE_LINK            = i586-mingw32msvc-g++\n",[254,3302,3303],{"class":256,"line":835},[254,3304,3305],{"class":263},"> QMAKE_LINK_C          = i586-mingw32msvc-gcc\n",[254,3307,3308],{"class":256,"line":1460},[254,3309,3310],{"class":414},"77c77\n",[254,3312,3313],{"class":256,"line":1483},[254,3314,3315],{"class":620},"\u003C !isEmpty(QMAKE_SH) {\n",[254,3317,3318],{"class":256,"line":1502},[254,3319,3213],{"class":414},[254,3321,3322],{"class":256,"line":1510},[254,3323,3324],{"class":263},"> #!isEmpty(QMAKE_SH) {\n",[254,3326,3327],{"class":256,"line":1549},[254,3328,3329],{"class":414},"88,100c88,100\n",[254,3331,3332],{"class":256,"line":1580},[254,3333,3334],{"class":620},"\u003C } else {\n",[254,3336,3337],{"class":256,"line":1587},[254,3338,3339],{"class":620},"\u003C       QMAKE_COPY              = copy \u002Fy\n",[254,3341,3342],{"class":256,"line":1592},[254,3343,3344],{"class":620},"\u003C       QMAKE_COPY_DIR          = xcopy \u002Fs \u002Fq \u002Fy \u002Fi\n",[254,3346,3348],{"class":256,"line":3347},31,[254,3349,3350],{"class":620},"\u003C       QMAKE_MOVE              = move\n",[254,3352,3354],{"class":256,"line":3353},32,[254,3355,3356],{"class":620},"\u003C       QMAKE_DEL_FILE          = del\n",[254,3358,3360],{"class":256,"line":3359},33,[254,3361,3362],{"class":620},"\u003C       QMAKE_MKDIR             = mkdir\n",[254,3364,3366],{"class":256,"line":3365},34,[254,3367,3368],{"class":620},"\u003C       QMAKE_DEL_DIR           = rmdir\n",[254,3370,3372],{"class":256,"line":3371},35,[254,3373,3374],{"class":620},"\u003C     QMAKE_CHK_DIR_EXISTS      = if not exist\n",[254,3376,3378],{"class":256,"line":3377},36,[254,3379,3380],{"class":620},"\u003C }\n",[254,3382,3384],{"class":256,"line":3383},37,[254,3385,3386],{"class":620},"\u003C\n",[254,3388,3390],{"class":256,"line":3389},38,[254,3391,3392],{"class":620},"\u003C QMAKE_MOC             = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}moc.exe\n",[254,3394,3396],{"class":256,"line":3395},39,[254,3397,3398],{"class":620},"\u003C QMAKE_UIC             = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}uic.exe\n",[254,3400,3402],{"class":256,"line":3401},40,[254,3403,3404],{"class":620},"\u003C QMAKE_IDC             = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}idc.exe\n",[254,3406,3408],{"class":256,"line":3407},41,[254,3409,3213],{"class":414},[254,3411,3413],{"class":256,"line":3412},42,[254,3414,3415],{"class":263},"> #} else {\n",[254,3417,3419],{"class":256,"line":3418},43,[254,3420,3421],{"class":263},"> #     QMAKE_COPY              = copy \u002Fy\n",[254,3423,3425],{"class":256,"line":3424},44,[254,3426,3427],{"class":263},"> #     QMAKE_COPY_DIR          = xcopy \u002Fs \u002Fq \u002Fy \u002Fi\n",[254,3429,3431],{"class":256,"line":3430},45,[254,3432,3433],{"class":263},"> #     QMAKE_MOVE              = move\n",[254,3435,3437],{"class":256,"line":3436},46,[254,3438,3439],{"class":263},"> #     QMAKE_DEL_FILE          = del\n",[254,3441,3443],{"class":256,"line":3442},47,[254,3444,3445],{"class":263},"> #     QMAKE_MKDIR             = mkdir\n",[254,3447,3449],{"class":256,"line":3448},48,[254,3450,3451],{"class":263},"> #     QMAKE_DEL_DIR           = rmdir\n",[254,3453,3455],{"class":256,"line":3454},49,[254,3456,3457],{"class":263},"> #    QMAKE_CHK_DIR_EXISTS     = if not exist\n",[254,3459,3461],{"class":256,"line":3460},50,[254,3462,3463],{"class":263},"> #}\n",[254,3465,3467],{"class":256,"line":3466},51,[254,3468,3469],{"class":263},">\n",[254,3471,3473],{"class":256,"line":3472},52,[254,3474,3475],{"class":263},"> QMAKE_MOC             = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}moc-qt4\n",[254,3477,3479],{"class":256,"line":3478},53,[254,3480,3481],{"class":263},"> QMAKE_UIC             = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}uic-qt4\n",[254,3483,3485],{"class":256,"line":3484},54,[254,3486,3487],{"class":263},"> QMAKE_IDC             = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}idc-qt4\n",[11,3489,3490],{},"Une fois terminé on peut compiler et lancer l'application de la manière\nsuivante :",[245,3492,3494],{"className":247,"code":3493,"language":249,"meta":32,"style":32},"> qmake-qt4 -spec win32-x-g++\n> make\n> wine .\u002Frelease\u002Ftest.exe\n",[251,3495,3496,3501,3505],{"__ignoreMap":32},[254,3497,3498],{"class":256,"line":197},[254,3499,3500],{"class":414},"> qmake-qt4 -spec win32-x-g++\n",[254,3502,3503],{"class":256,"line":165},[254,3504,2503],{"class":414},[254,3506,3507],{"class":256,"line":275},[254,3508,3509],{"class":414},"> wine .\u002Frelease\u002Ftest.exe\n",[11,3511,3512],{},[42,3513],{"alt":3514,"src":3515},"cross-compil4","\u002FProgrammation\u002Fcross-compilation-compiler-un-programme-pour-ms-windows-sous-gnu-linux\u002Fcross-compil4.png",[139,3517,1720],{"id":1719},[11,3519,3520],{},"Et voilà, vous êtes maintenant capable de faire de la compilation\ncroisée pour des programmes aussi simples que complexes :). Quand vos\nprogrammes ont des dépendances, et si vous le pouvez, préférez la\nversion binaire. Sinon vous devrez compiler les librairies vous-même au\nformat Windows de la même manière avant de compiler votre programme.\nCela peut vous obliger à modifier les scriptes de build.",[134,3522,3524,3527],{"className":3523,"dataFootnotes":32},[137],[139,3525,143],{"className":3526,"id":31},[142],[145,3528,3529,3535,3544,3553,3562,3575,3584,3593],{},[68,3530,3531,3532],{"id":149},"En français cela donne compilation croisée ",[27,3533,163],{"href":159,"ariaLabel":160,"className":3534,"dataFootnoteBackref":32},[162],[68,3536,3538,3539],{"id":3537},"user-content-fn-2","bien que ... ",[27,3540,163],{"href":3541,"ariaLabel":3542,"className":3543,"dataFootnoteBackref":32},"#user-content-fnref-2","Back to reference 2",[162],[68,3545,3547,3548],{"id":3546},"user-content-fn-3","là aussi avec les smartphones actuels, on peut en douter ",[27,3549,163],{"href":3550,"ariaLabel":3551,"className":3552,"dataFootnoteBackref":32},"#user-content-fnref-3","Back to reference 3",[162],[68,3554,3556,3557],{"id":3555},"user-content-fn-4","très lointain ",[27,3558,163],{"href":3559,"ariaLabel":3560,"className":3561,"dataFootnoteBackref":32},"#user-content-fnref-4","Back to reference 4",[162],[68,3563,3565,3566,3569,3570],{"id":3564},"user-content-fn-5","MinGW est un ",[15,3567,3568],{},"portage"," de gcc pour Window. Il nous permettra donc de générer un executable Windows à partir de notre Gnu\u002FLinux ",[27,3571,163],{"href":3572,"ariaLabel":3573,"className":3574,"dataFootnoteBackref":32},"#user-content-fnref-5","Back to reference 5",[162],[68,3576,3578,3579],{"id":3577},"user-content-fn-6","Un émulateur pour démarrer des programmes Windows sous Linux ",[27,3580,163],{"href":3581,"ariaLabel":3582,"className":3583,"dataFootnoteBackref":32},"#user-content-fnref-6","Back to reference 6",[162],[68,3585,3587,3588],{"id":3586},"user-content-fn-7","L'installation de wine sous une distribution 64-bit peut-être un peu plus compliqué que prévu, mais reste néanmoins faisable. Référez vous à la documentation de votre distribution. ",[27,3589,163],{"href":3590,"ariaLabel":3591,"className":3592,"dataFootnoteBackref":32},"#user-content-fnref-7","Back to reference 7",[162],[68,3594,3596,3597,3601,3602],{"id":3595},"user-content-fn-8","Vous pouvez aussi le télécharger ",[27,3598,3600],{"href":3599},"\u002FProgrammation\u002Fcross-compilation-compiler-un-programme-pour-ms-windows-sous-gnu-linux\u002Fqmake.conf.diff","ici",". ",[27,3603,163],{"href":3604,"ariaLabel":3605,"className":3606,"dataFootnoteBackref":32},"#user-content-fnref-8","Back to reference 8",[162],[1725,3608,3609],{},"html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html pre.shiki code .seHd6, html code.shiki .seHd6{--shiki-default:#C678DD}html pre.shiki code .s_ZVi, html code.shiki .s_ZVi{--shiki-default:#E06C75;--shiki-default-font-style:italic}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}html pre.shiki code .sU0A5, html code.shiki .sU0A5{--shiki-default:#E5C07B}html pre.shiki code .sV9Aq, html code.shiki .sV9Aq{--shiki-default:#7F848E;--shiki-default-font-style:italic}",{"title":32,"searchDepth":165,"depth":165,"links":3611},[3612,3614,3615,3616,3617,3618,3619],{"id":1781,"depth":275,"text":3613},"Qu'est que la cross-compilation1 ?",{"id":1839,"depth":275,"text":1840},{"id":1902,"depth":275,"text":1893},{"id":2047,"depth":275,"text":1896},{"id":2904,"depth":275,"text":2905},{"id":1719,"depth":165,"text":1720},{"id":31,"depth":165,"text":143},"2012-07-01",{"type":8,"value":3622},[3623,3630,3632,3634,3636,3656,3658],[206,3624,1782,3625,1788],{"id":1781},[24,3626,3627],{},[27,3628,34],{"href":29,"ariaDescribedBy":3629,"dataFootnoteRef":32,"id":33},[31],[11,3631,1791],{},[11,3633,1794],{},[11,3635,1797],{},[65,3637,3638,3640,3647,3654],{},[68,3639,1802],{},[68,3641,1805,3642,1813],{},[24,3643,3644],{},[27,3645,658],{"href":1810,"ariaDescribedBy":3646,"dataFootnoteRef":32,"id":1812},[31],[68,3648,1816,3649,1813],{},[24,3650,3651],{},[27,3652,1824],{"href":1821,"ariaDescribedBy":3653,"dataFootnoteRef":32,"id":1823},[31],[68,3655,1827],{},[11,3657,1830],{},[11,3659,1833,3660,35],{},[15,3661,1836],{},{},"\u002Fpost\u002Fcross-compilation-compiler-un-programme-pour-ms-windows-sous-gnu-linux",{"title":1776,"description":32},"cross-compilation-compiler-un-programme-pour-ms-windows-sous-gnu-linux","posts\u002FProgrammation\u002F2012-07-01-cross-compilation-compiler-un-programme-pour-ms-windows-sous-gnu-linux",[196],"xyp3lTmc_CVoPo48zy-LSh68_42nO_FD4l7WdmhTvoA",{"id":3670,"title":3671,"author":6,"body":3672,"category":3719,"categorySlug":3919,"date":3920,"description":32,"excerpt":3921,"extension":187,"location":188,"meta":3945,"navigation":190,"path":3946,"published":190,"seo":3947,"slug":3948,"stem":3949,"tags":3950,"timeToRead":275,"__hash__":3953},"posts\u002Fposts\u002FKMDAlert\u002F2011-08-14-kmdalert-0.2.md","KMDAlert - Logiciel de surveillance de périphérique RAID - Version pour KDE 4.0",{"type":8,"value":3673,"toc":3911},[3674,3678,3686,3693,3704,3707,3710,3714,3739,3749,3756,3776,3781,3785,3791,3861,3864,3868,3876,3880,3901,3905,3908],[139,3675,3677],{"id":3676},"présentation","Présentation",[11,3679,3680,3681,3685],{},"Possédant chez moi des disques durs en RAID logiciels sous Gnu\u002FLinux, en\n2007 (cela fait déjà 4 ans), ",[27,3682,3684],{"href":3683},"\u002Fpost\u002F2007-08-17-kmdalert-logiciel-de-surveillance-raid\u002F","j'avais écrit un petit logiciel"," dont le\nbut était de faire du monitoring RAID.",[11,3687,3688,3689,3692],{},"En cas de reconstruction du RAID ou de disque défectueux, le logiciel\naffiche une notification à l'utilisateur, et change le statut affiché\ndans la barre de notification (",[15,3690,3691],{},"systray","). L'icône change bien sur en\nfonction de l'état du RAID :",[65,3694,3695,3698,3701],{},[68,3696,3697],{},"dégradé (avec un point d'exclamation)",[68,3699,3700],{},"en cours de synchronisation (avec une barre de progression)",[68,3702,3703],{},"disque RAID dans un état normal",[11,3705,3706],{},"Ce logiciel ne tournait que sous KDE 3.X.",[11,3708,3709],{},"Voici donc une nouvelle version (qui a mis le temps de sortir) qui est\nun portage de l'application sous KDE 4.X. Elle utilise donc le nouveau\nsystème de notification de KDE (pour l'instant en passant uniquement par\nles notifications standard). Quelques améliorations y seront apportées\nplus tard.",[139,3711,3713],{"id":3712},"requis","Requis",[11,3715,3716,3717,3720,3721,3724,3725,3728,3729,435,3732,3735,3736,3738],{},"Pour fonctionner ",[15,3718,3719],{},"KMDAlert"," nécessite que le dossier ",[251,3722,3723],{},"\u002Fsys"," soit monté\net que ",[251,3726,3727],{},"\u002Fsys\u002Fblock\u002F"," soit renseigné pour chaque volume RAID (exemple\n",[251,3730,3731],{},"\u002Fsys\u002Fblock\u002Fmd0",[251,3733,3734],{},"\u002Fsys\u002Fblock\u002Fmd1",", ...). ",[251,3737,3719],{}," observe ensuite les\nmodifications faites sur les fichiers pour informer l'utilisateur des\nmodifications faites sur le volume RAID ou sur les disques le composant.",[11,3740,3741,3742,3744,3745,3748],{},"De nos jours le dossier ",[251,3743,3723],{}," et ",[251,3746,3747],{},"\u002Fsys\u002Fblock"," devraient être toujours\nprésents.",[11,3750,3751,3752,3755],{},"L'application a été développée sur ",[15,3753,3754],{},"Gnu\u002FDebian Squeeze",", sur un KDE\n4.4.5 avec un noyau 2.6.32.",[11,3757,3758,3760,3761,3601,3764,3766,3767,3769,3770,3772,3773,3775],{},[15,3759,3719],{}," ne nécessite pas de ",[15,3762,3763],{},"Inotify",[15,3765,3719],{}," lit le contenu de\nplusieurs fichiers dans le dossier ",[251,3768,3723],{}," toutes les 6 secondes pour\nêtre informé de la modification de l'état du périphérique. Sur\nl'application d'origine, développé sous un noyau 2.6.18, ",[15,3771,3763],{}," n'est\npas averti des modifications faites sur le système de fichier ",[251,3774,3723],{},".\nLes dates de ces fichiers ne sont pas non plus modifiées. Si quelqu'un a\nune autre méthode à me proposer, je reste ouvert à toutes propositions.",[11,3777,3778,3780],{},[15,3779,3719],{}," est une application écrite en utilisant les librairies de\nKDE, mais devrait tout de même fonctionner sous Gnome. Les messages de\nnotification utilisent donc le système de notification de KDE (bien que\nje n'utilise pas toutes ses possibilités).",[139,3782,3784],{"id":3783},"compilation-installation","Compilation \u002F Installation",[11,3786,3787,3788,3790],{},"La compilation et l'installation de ",[15,3789,3719],{}," se fait à l'aide du trio\nhabituel :",[245,3792,3794],{"className":247,"code":3793,"language":249,"meta":32,"style":32},"# Décompression de KMDAlert\ntar xjfv kmdalert-0.2-77c0d6b4d49f.tar.gz\ncd kmdalert-77c0d6b4d49f\n# Préparation de la compilation\nmkdir build\ncd build\n# Comilation\ncmake ..\u002Fmake\n# Installation\nmake install\n",[251,3795,3796,3801,3812,3819,3824,3830,3836,3841,3848,3853],{"__ignoreMap":32},[254,3797,3798],{"class":256,"line":197},[254,3799,3800],{"class":534},"# Décompression de KMDAlert\n",[254,3802,3803,3806,3809],{"class":256,"line":165},[254,3804,3805],{"class":259},"tar",[254,3807,3808],{"class":263}," xjfv",[254,3810,3811],{"class":263}," kmdalert-0.2-77c0d6b4d49f.tar.gz\n",[254,3813,3814,3816],{"class":256,"line":275},[254,3815,270],{"class":269},[254,3817,3818],{"class":263}," kmdalert-77c0d6b4d49f\n",[254,3820,3821],{"class":256,"line":462},[254,3822,3823],{"class":534},"# Préparation de la compilation\n",[254,3825,3826,3828],{"class":256,"line":490},[254,3827,260],{"class":259},[254,3829,901],{"class":263},[254,3831,3832,3834],{"class":256,"line":512},[254,3833,270],{"class":269},[254,3835,901],{"class":263},[254,3837,3838],{"class":256,"line":517},[254,3839,3840],{"class":534},"# Comilation\n",[254,3842,3843,3845],{"class":256,"line":523},[254,3844,912],{"class":259},[254,3846,3847],{"class":263}," ..\u002Fmake\n",[254,3849,3850],{"class":256,"line":538},[254,3851,3852],{"class":534},"# Installation\n",[254,3854,3855,3858],{"class":256,"line":555},[254,3856,3857],{"class":259},"make",[254,3859,3860],{"class":263}," install\n",[11,3862,3863],{},"La compilation nécessite les librairies de développement KDE et Qt3,\nainsi que le compilateur GCC.",[139,3865,3867],{"id":3866},"licence","Licence",[11,3869,3870,3871],{},"La licence choisie est la ",[27,3872,3875],{"href":3873,"rel":3874},"http:\u002F\u002Fwww.gnu.org\u002Flicenses\u002Fgpl-2.0.txt",[155],"GNU GENERAL PUBLIC LICENSE",[139,3877,3879],{"id":3878},"téléchargement","Téléchargement",[65,3881,3882,3890,3898],{},[68,3883,3884,3885,35],{},"Vous pouvez télécharger une archive déjà construite de l'application\nsur ",[27,3886,3889],{"href":3887,"rel":3888},"http:\u002F\u002Fkde-apps.org\u002Fcontent\u002Fshow.php\u002FKMDAlert?content=73373",[155],"KDE-Apps.org",[68,3891,3892,3893,35],{},"Le dépôt officiel pour télécharger les sources et participer :\n",[27,3894,3897],{"href":3895,"rel":3896},"https:\u002F\u002Fgogs.shadoware.org\u002Fphoenix\u002Fkmdalert?pk_campaign=shadoware",[155],"https:\u002F\u002Fgogs.shadoware.org\u002Fphoenix\u002Fkmdalert",[68,3899,3900],{},"Vous pouvez également télécharger la version attachée au billet.",[139,3902,3904],{"id":3903},"système-de-suivi","Système de suivi",[11,3906,3907],{},"Il n'y a actuellement plus de système de suivi pour ce logiciel. En cas\nde problème, vous pouvez laisser un message dans les commentaires ou\nm'envoyer un mail.",[1725,3909,3910],{},"html pre.shiki code .sV9Aq, html code.shiki .sV9Aq{--shiki-default:#7F848E;--shiki-default-font-style:italic}html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":32,"searchDepth":165,"depth":165,"links":3912},[3913,3914,3915,3916,3917,3918],{"id":3676,"depth":165,"text":3677},{"id":3712,"depth":165,"text":3713},{"id":3783,"depth":165,"text":3784},{"id":3866,"depth":165,"text":3867},{"id":3878,"depth":165,"text":3879},{"id":3903,"depth":165,"text":3904},"kmdalert","2011-08-14",{"type":8,"value":3922},[3923,3925,3929,3933,3941,3943],[139,3924,3677],{"id":3676},[11,3926,3680,3927,3685],{},[27,3928,3684],{"href":3683},[11,3930,3688,3931,3692],{},[15,3932,3691],{},[65,3934,3935,3937,3939],{},[68,3936,3697],{},[68,3938,3700],{},[68,3940,3703],{},[11,3942,3706],{},[11,3944,3709],{},{},"\u002Fpost\u002Fkmdalert-0.2",{"title":3671,"description":32},"kmdalert-0.2","posts\u002FKMDAlert\u002F2011-08-14-kmdalert-0.2",[3951,196,3919,3952],"kde","raid","4FaKIyQl43RcZ_dgavc_Yj95PpItKkc48C5B55Yud_8",1777582407054]