1. fejezet. Programozási nyelvek C/C++ fordítási modell CMake Visual Studio Code. Haladó alkalmazott programozás ELTE, Budapest 2019.

Hasonló dokumentumok
GPU Lab. 5. fejezet. A C++ fordítási modellje. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

Szoftver technológia. Build systems. Cserép Máté ELTE Informatikai Kar 2019.

Programozás I. gyakorlat

OPENCV TELEPÍTÉSE SZÁMÍTÓGÉPES LÁTÁS ÉS KÉPFELDOLGOZÁS. Tanács Attila Képfeldolgozás és Számítógépes Grafika Tanszék Szegedi Tudományegyetem

Kiszolgálók üzemeltetése. Iványi Péter

C++ programok fordítása

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Programzás I gyakorlat

Mobil Informatikai Rendszerek

Mobil Informatikai Rendszerek

Bevezetés a Python programozási nyelvbe

1. Bevezetés szeptember 9. BME Fizika Intézet. Szám. szim. labor ea. Tőke Csaba. Tudnivalók. feladat. Tematika. Moodle Házi feladatok

Bevezetés a QGIS program használatába Összeálította dr. Siki Zoltán

Digitális aláíró program telepítése az ERA rendszeren

Elemi alkalmazások fejlesztése I.

Image Processor BarCode Service. Felhasználói és üzemeltetői kézikönyv

Széchenyi István Egyetem

A NetBeans IDE Ubuntu Linux operációs rendszeren

C programozási nyelv

Tartalomjegyzék. Általános Információ! 2. Felhasználói dokumentáció! 3. Feladat! 3. Környezet! 3. Használat! 3. Bemenet! 3. Példa!

E-Freight beállítási segédlet

Internetkonfigurációs követelmények. A számítógép konfigurálása. Beállítások Windows XP alatt

Telepítési útmutató a Solid Edge ST7-es verziójához Solid Edge

Bevezetés a Programozásba II 4. előadás. Adattípusok hordozhatósága

Tartalomjegyzék. Legfőbb különbségek az MPLAB 8-hoz képest

4. Laborgyakorlat. A fájlokról ezeket az adatokat, a fájlrendszer tárolja. Számunkra az 1, 3, 4. oszlopok lesznek az érdekesek.

Kinek szól a könyv? A könyv témája A könyv felépítése Mire van szükség a könyv használatához? A könyvben használt jelölések. 1. Mi a programozás?

Selling Platform Telepítési útmutató Gyakori hibák és megoldások

A Code::Blocks fejlesztőkörnyezet

Digitális aláíró program telepítése az ERA rendszeren

1 Rendszerkövetelmények

Kedvenc Ingyenes editorok avagy milyen a programozó jobbkeze? PSPAD editor DEVPHP IDE

M-Fájlok létrehozása MATLAB-ban

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

15. Programok fordítása és végrehajtása

ALKALMAZÁSOK ISMERTETÉSE

TERKA Törvényességi Ellenőrzési Rendszer Kiegészítő Alkalmazás

Az internet ökoszisztémája és evolúciója. Gyakorlat 1

chmod umask chown, chgrp

Delphi programozás I.

Samsung Universal Print Driver Felhasználói útmutató

Operációs rendszerek. 4. gyakorlat. BASH bevezetés, script írása, futtatása UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Vizuális, eseményvezérelt programozás XI.

A Windows az összetartozó adatokat (fájlokat) mappákban (könyvtárakban) tárolja. A mappák egymásba ágyazottak.

BaBér. Bérügyviteli rendszer. Telepítési segédlet 2014.

Dropbox - online fájltárolás és megosztás

Hardver modellezés SystemC-vel és SDL grafikus könyvtárral Visual Stúdió alatt

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

1. DVNAV letöltése és telepítése

Operációs rendszerek gyak.

Programozási alapismeretek 1. előadás

Data Integrátorok a gyakorlatban Oracle DI vs. Pentaho DI Fekszi Csaba Ügyvezető Vinnai Péter Adattárház fejlesztő február 20.

C vagy C++? Programozási Nyelvek és Fordítóprogramok Tanszék. Pataki Norbert. Programozási Nyelvek I.

Tortoise SVN használata. Képes útmutató

Selling Platform Telepítési útmutató Gyakori hibák és megoldások

Podoski Péter és Zabb László

Telepítési Kézikönyv

1. Alapok. #!/bin/bash

Point of View Android 2.3 Tablet Kézikönyv ProTab 2XL

Programozás II. 2. Dr. Iványi Péter

Java-s Nyomtatványkitöltő Program Súgó

Java-ról Kotlinra. Ekler Péter AutSoft BME AUT. AutSoft

Tájékoztató a kollégiumi internet beállításához

Országos Területrendezési Terv térképi mel ékleteinek WMS szolgáltatással történő elérése, Quantum GIS program alkalmazásával Útmutató 2010.

eszemélyi Kliens Szoftvercsomag

Operációs Rendszerek II. labor. 2. alkalom

WIFI elérés beállítása Windows XP tanúsítvánnyal

A Zotero hivatkozáskezelő program bemutatása. Mátyás Melinda

Pénzügyi algoritmusok

Google Drive szinkronizálása asztali géppel Linux rendszeren

C++ fejlesztés az ECLIPSE környezetben

Szathmáry László Debreceni Egyetem Informatikai Kar

Clang Static Analyzer belülről

kommunikáció Megoldások

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Az internet ökoszisztémája és evolúciója. Gyakorlat 1

A Remote Support Platform 3.0 újdonságai

WordPress segédlet. Bevezető. Letöltés. Telepítés

Programozási nyelvek JAVA EA+GY 1. gyakolat

Hardver és szoftver követelmények

Több platform egy kódbázis Tanulságok a Tresorittól. Budai Péter, vezető fejlesztő

Egészítsük ki a Drupal-t. Drupal modul fejlesztés

Digitális technika VIMIAA01 9. hét Fehér Béla BME MIT

Digitális technika VIMIAA01 9. hét

Szoftver technológia. Projektmenedzsment eszközök. Cserép Máté ELTE Informatikai Kar 2019.

OpenCL alapú eszközök verifikációja és validációja a gyakorlatban

A Telepítés hajlékonylemezről panelen kattintson az OK gombra.

Automatizált Java Build. ApacheAnt használatával

Szilipet programok telepítése Hálózatos (kliens/szerver) telepítés Windows 7 operációs rendszer alatt

Az Evolut Főkönyv program telepítési és beállítási útmutatója v2.0

Java I. A Java programozási nyelv

Youtube videó letöltés és konvertálás Linuxon

RapidMiner telepítés i. RapidMiner telepítés

Android alapok. Android játékfejlesztés

Nyolcbites számláló mintaprojekt

Kézikönyv. Szelekciós operátorok használata

Navigációs GPS adatok kezelése QGIS programmal (1.4 verzió) Összeállította dr. Siki Zoltán

Dinamikus csatolású függvénykönyvtár készítése és használata Plugin-szerű betöltés Egyszeű C++ osztályok készítése

OOP és UML Áttekintés

Nyomtató telepítése. 1. ábra Nyomtatók és faxok Nyomtató hozzáadása

Átírás:

1. fejezet Programozási nyelvek C/C++ fordítási modell CMake Visual Studio Code Haladó alkalmazott programozás ELTE, Budapest 2019

Programozási nyelvek Minden célra a megfelelő eszközt

Milyen szempontok szerint válasszunk? Mi a cél feladat? Mennyi időm van leprogramozni a feladatot? Hányszor fogom futtatni a programot? Min fogom futtatni? Milyen nyelvekkel vagyok ismeretes?

Nyelvek típus szerint Fejlesztési idő Futási idő

A blub paradoxon A B C D E F G H I J K L 11/15/2016 5

A blub paradoxon Rendezzük a nyelveket erő sorrendbe A rendezési elv a nyelvek kifejező ereje A gondolat kísérlet kedvéért tételezzük fel, hogy létezik ez a spektrum A B C D F G H I J K L 11/15/2016 6

A blub paradoxon Rendezzük a nyelveket erő sorrendbe A rendezési elv a nyelvek kifejező ereje A gondolat kísérlet kedvéért tételezzük fel, hogy létezik ez a spektrum Válasszunk egy programozót, aki egy tetszőleges, nem szélsőséges nyelvben jártas Hívjuk ezt a nyelvet blub -nak A B C D F G H I J K L 11/15/2016 7

A blub paradoxon A képzeletbeli programozónk a blub -nál egyszerűbb nyelvek sorrendjét meg tudja erősíteni Meg tudja mondani, hogy B jobb A-tól, mert van benne X és Y ami hiányzik A-ból (pedig hasznos) A B C D F G H I J K L 11/15/2016 8

A blub paradoxon A képzeletbeli programozónk a blub -nál egyszerűbb nyelvek sorrendjét meg tudja erősíteni Meg tudja mondani, hogy B jobb A-tól, mert van benne X és Y ami hiányzik A-ból (pedig hasznos) Azonban amikor felfelé tekint a spektrumon, csak egy kupac furcsa nyelvet lát Miért létezik Z és Q a J és K nyelvekben, amikor én simán megoldok minden problémát nélkülük? A B C D F G H I J K L 11/15/2016 9

Az ismeretlentől való félelem Talán egyetérthetünk abban, hogy assemblerben tudományos szimulációkat nem lehet írni A C-ben bármit meg lehet írni analogonja a bármeddig el lehet számolni A magasabb szintű nyelveket (kifejező erő) nem ok nélkül hozták létre A programnyelvek és a hozzájuk tartozó eszközök fejlődnek Most már tudunk jobbat Akkor jó ötletnek tűnt 11/15/2016 10

Az ismeretlentől való félelem Cobol, Fortran, C Gépközeli nyelvek Egyes hardveres részleteket elrejtenek Egységes memória címtér Gyenge típus biztonság I/O képességek (operációs rendszerek) Természetüknél fogva imperatív (épp mint a lyukkártya és az assembler) Fordítók optimalizálják a programot, hogy az minél jobban illeszkedjen a gép képességeihez 11/15/2016 11

Az ismeretlentől való félelem C++, D, Go, Rust, C#, Java, etc. Gépközeli nyelvek Absztrakciók létrehozása Elrejtik az implementáció részleteit Változó, hogy az egyes nyelvek mennyi alacsony-szintű hozzáférést tesznek elérhetővé Futási garanciák Erőforrás kezelés (RAII, garbage collection) Race conditions (párhuzamos programozási hibák) Futási idejű hibákat fordítási idejű hibává alakítanak (!) Kifejező erő Öröklődés és objektum orientáltság ( is a versus has a viszony) Generikus programozás (deduplikáció versus absztrakció) 11/15/2016 12

Az ismeretlentől való félelem OCaml, Haskell, F#, Julia, Idris Akadémiai nyelvek Értsd: nem prostituálták az alapokat, csak azért hogy kitolják a gyár kapun Alkalmazott matematika A kifejező erő az előtérben Teljesítményt áldoznak a kifejező, rugalmas típus rendszer oltárán Letisztult alapok (több akadémia, kevesebb ipar) 11/15/2016 13

A blub paradoxon A B C D F G H I J K L 11/15/2016 14

A blub paradoxon asm B C D F G H I J K L 11/15/2016 15

A blub paradoxon asm B C D F G H I J K Idris 11/15/2016 16

A blub paradoxon asm B C D F C++ H I J K Idris 11/15/2016 17

C/C++ fordítási modell Miből lesz a cserebogár?

Hogyan működnek a fordított nyelvek? Forrás fájl(ok) Fordítás Futtatható

Hogyan fordul egy C/C++ program? vector algorithm iostream RK4.hpp Interaction.hpp Application.cpp FileReader.cpp Particle.cpp Solver.cpp Header-ek Függvény és típus deklarációkat tartalmaz Függvény deklaráció: név, szignatúra Szignatúra: ki-, bemenet típusai func M, V V Források A függvények definícióját tartalmazza A definíció valójában az implementáció, a parancsok sorozata, amit végre kell hajtani Források Headerök

Hogyan fordul egy C/C++ program? vector algorithm iostream RK4.hpp Interaction.hpp Application.cpp FileReader.cpp Particle.cpp Solver.cpp Források Minden forrásfájl egy fordítási egység A források behúznak (include) n headert A header-ek egymást is behúzhatják C/C++ része a One Defintion Rule Ha egy headert többször is behúzunk, az általában ODR sértés Ezt Include Guard-okkal kerüljük el Miért szeparáljuk el így a kódot ha ennyire bonyolult? Fícsör és implementáció szétválasztása Fordítási idők (lásd később) Headerök

Hogyan fordul egy C/C++ program? vector algorithm iostream RK4.hpp Interaction.hpp Application.cpp FileReader.cpp Particle.cpp Solver.cpp Fordító Application.o FileReader.o Particle.o Solver.o Objektumok Az objektum fájlokban kidekorált gépi kód van A függvénytörzsek gépi kódja van bennük A dekoráció a fordító által generált azonosítókból áll: szimbólum operator*(classmat,classvec)->classvec

Hogyan fordul egy C/C++ program? vector algorithm iostream RK4.hpp Interaction.hpp Application.cpp FileReader.cpp Particle.cpp Solver.cpp Application.o FileReader.o Particle.o Solver.o MyApp.exe MyLib.dll Fordító Linker

Hogyan fordul egy C/C++ program? Egy futtatható linkelése A linker megkeresi az összes objektum fájl közül azt, amelyikben egy speciális, main nevű függvény található Ha több ilyet talál, hibát dob Megnézi, mely függvényekre lehet szükség futtatás során Ha valamilyen könyvtár linkelésre meg van jelölve, az abban található szimbólumokat is átvizsgálja Egyes függvények így is többször lehetnek lefordítva Ha a szimbólumhoz tartozó binárisok megegyeznek, egy kivételével eldobjuk őket Ha különböznek, hibát dobunk Ha valamilyen szimbólum hiányzik, hibát dobunk A header-forrás szétválasztással minimalizáljuk annak az esélyét, hogy egy függvény többször legyen lefordítva

Statikus és dinamikus könyvtárak Statikus Statikus linkelés során a szimbólumok binárisai bemásolódnak a futtathatóba Gyorsabb kód Ha sok futtatható hivatkozik ugyanarra a binárisra statikusan, többszörösen fog szerepelni memóriában Lassabb kód Futtatáskor nem kell semmi más, csak a futtatható állomány Mindig indul a futtatható Dinamikus Dinamikus linkelés során a futtathatóba csak egy hivatkozás kerül a szimbólumra Lassabb kód Ha sok futtatható hivatkozik ugyanarra a binárisra dinamikusan, elég egyszer betölteni memóriába Gyorsabb kód Futtatáskor kellenek a dinamikusan linkelt könyvtárak is Helyes konfiguráció kell hozzá

Hogyan fordítanánk parancssorból? PS /home/mnagy> g++ -o Hello.o -c Hello.cpp PS /home/mnagy> g++ -o Hello Hello.o PS /home/mnagy> chmod +x Hello PS /home/mnagy>./hello Hello, world! PS /home/mnagy> clang++ -o Hello.o -c Hello.cpp PS /home/mnagy> clang++ -o Hello Hello.o PS /home/mnagy> chmod +x./hello PS /home/mnagy>./hello Hello, world! PS C:\Users\mnagy> cl.exe /nologo /EHsc /Fo: Hello.o /c Hello.cpp Hello.cpp PS C:\Users\mnagy> link.exe /nologo Hello.o /out:hello.exe PS C:\Users\mnagy>.\Hello.exe Hello, world!

Hogyan fordítanánk parancssorból? PS /home/mnagy> g++ -o Hello.o -c Hello.cpp PS /home/mnagy> g++ -o Hello Hello.o PS /home/mnagy> chmod +x Hello PS /home/mnagy>./hello Hello, world! PS /home/mnagy> clang++ -o Hello.o -c Hello.cpp PS /home/mnagy> clang++ -o Hello Hello.o PS /home/mnagy> chmod +x./hello PS /home/mnagy>./hello Hello, world! g++ (Linux) Clang (Linux) PS C:\Users\mnagy> cl.exe /nologo /EHsc /Fo: Hello.o /c Hello.cpp Hello.cpp PS C:\Users\mnagy> link.exe /nologo Hello.o /out:hello.exe PS C:\Users\mnagy>.\Hello.exe Hello, world! MSVC (Windows)

Hogyan fordítanánk parancssorból? PS /home/mnagy> g++ -o Hello.o -c Hello.cpp PS /home/mnagy> g++ -o Hello Hello.o PS /home/mnagy> chmod +x Hello PS /home/mnagy>./hello Hello, world! PS /home/mnagy> clang++ -o Hello.o -c Hello.cpp PS /home/mnagy> clang++ -o Hello Hello.o PS /home/mnagy> chmod +x./hello PS /home/mnagy>./hello Hello, world! Fordítási kapcsolók -o kimeneti fájnév (output) megadása -c csak fordítás (compile) chmod +x Fájl mód váltás (change mode), végrehajthatóság (execute) hozzáadása

Hogyan fordítanánk parancssorból? PS C:\Users\mnagy> cl.exe /nologo /EHsc /Fo: Hello.o /c Hello.cpp Hello.cpp PS C:\Users\mnagy> link.exe /nologo Hello.o /out:hello.exe PS C:\Users\mnagy>.\Hello.exe Hello, world! Fordítási kapcsolók /nologo, hogy ne írja ki mindig a program nevét és verzióját /EHsc, alapértelmezetten a C++ kivétel kezelését mellőzi a fordító /Fo: kimeneti fájlnév (object) megadása /c, csak fordítás Linkelési kapcsolók /nologo, detto /out: kimeneti fájlnév megadása

Hogyan fordítanánk parancssorból? PS /home/mnagy> g++ -o Hello Hello.cpp Other.cpp PS /home/mnagy>./hello Hello, world and others! PS /home/mnagy> clang++ -o Hello Hello.cpp Other.cpp PS /home/mnagy>./hello Hello, world and others! g++ (Linux) Clang (Linux) PS C:\Users\mnagy> cl.exe /nologo /EHsc /Fe: Hello.exe Hello.cpp Other.cpp Hello.cpp Other.cpp Generating Code... PS C:\Users\mnagy>.\Hello.exe Hello, world and others! MSVC (Windows) Mindegyik fordító támogatja, hogy egy lépésben fordítsunk és linkeljünk Egyszerre akár több forrás fájlt is

A törpök élete azonban nem csak játék és mese Eddig minden ment, mint a karikacsapás. Hogyan derül ki ha valami nem sikerült? Fordítási hiba A fordítás során jelentkezik Legfőbb ismérve, hogy a forráskódba mutat A legtöbb IDE még fordítás előtt észreveszi és jelzi Messze ez a leggyakoribb Linkelési hiba Fordítás után, linkeléskor Forráskódra már nem, csak objektum fájlokra hivatkozik Ha az IDE ismeri a fordítás teljes menetét, láthatja Ritkább, nehezebben érthető

A törpök élete azonban nem csak játék és mese C:\Kellekek\MICROS~1\VISUAL~1\16\VC\Tools\MSVC\1420~1.273\bin\HostX64\x64\cl.exe /nologo /TP /DWIN32 /D_WINDOWS /W3 /GR /EHsc /MDd /Zi /Ob0 /Od /RTC1 /JMC - std:c++14 /showincludes /FoCMakeProject1\CMakeFiles\CMakeProject1.dir\CMakeProject1.cpp.obj /FdCMakeProject1\CMakeFiles\CMakeProject1.dir\ /FS -c C:\Users\mnagy\Source\CMakeProject1\CMakeProject1\CMakeProject1.cpp C:\Users\mnagy\Source\CMakeProject1\CMakeProject1\CMakeProject1.cpp(3): error C2065: 'blub': undeclared identifier C:\Users\mnagy\Source\CMakeProject1\CMakeProject1\CMakeProject1.cpp(3): error C2146: syntax error: missing ';' before identifier 'a' C:\Users\mnagy\Source\CMakeProject1\CMakeProject1\CMakeProject1.cpp(3): error C2065: 'a': undeclared identifier int main() { blub a = 5; } return 0;

A törpök élete azonban nem csak játék és mese C:\Kellekek\MICROS~1\VISUAL~1\16\VC\Tools\MSVC\1420~1.273\bin\HostX64\x64\cl.exe /nologo /TP /DWIN32 /D_WINDOWS /W3 /GR /EHsc /MDd /Zi /Ob0 /Od /RTC1 /JMC - std:c++14 /showincludes /FoCMakeProject1\CMakeFiles\CMakeProject1.dir\CMakeProject1.cpp.obj /FdCMakeProject1\CMakeFiles\CMakeProject1.dir\ /FS -c C:\Users\mnagy\Source\CMakeProject1\CMakeProject1\CMakeProject1.cpp C:\Users\mnagy\Source\CMakeProject1\CMakeProject1\CMakeProject1.cpp(3): error C2065: 'blub': undeclared identifier C:\Users\mnagy\Source\CMakeProject1\CMakeProject1\CMakeProject1.cpp(3): error C2146: syntax error: missing ';' before identifier 'a' C:\Users\mnagy\Source\CMakeProject1\CMakeProject1\CMakeProject1.cpp(3): error C2065: 'a': undeclared identifier int main() { blub a = 5; } return 0;

A törpök élete azonban nem csak játék és mese /usr/bin/c++ -std=gnu++14 -o CMakeFiles/CMakeProject1.dir/CMakeProject1.cpp.o -c /mnt/c/users/mnagy/source/cmakeproject1/cmakeproject1/cmakeproject1.cpp /mnt/c/users/mnagy/source/cmakeproject1/cmakeproject1/cmakeproject1.cpp: In function int main() : /mnt/c/users/mnagy/source/cmakeproject1/cmakeproject1/cmakeproject1.cpp:3:5: error: blub was not declared in this scope blub a = 5; ^~~~ int main() { blub a = 5; } return 0;

A törpök élete azonban nem csak játék és mese /usr/bin/clang++-7 -std=gnu++14 -o CMakeFiles/CMakeProject1.dir/CMakeProject1.cpp.o -c /mnt/c/users/mnagy/source/cmakeproject1/cmakeproject1/cmakeproject1.cpp /mnt/c/users/mnagy/source/cmakeproject1/cmakeproject1/cmakeproject1.cpp:3:5: error: unknown type name 'blub' blub a = 5; ^ 1 error generated. int main() { blub a = 5; } return 0;

A törpök élete azonban nem csak játék és mese

A törpök élete azonban nem csak játék és mese LINK Pass 1: command "C:\Kellekek\MICROS~1\VISUAL~1\16\VC\Tools\MSVC\1420~1.273\bin\Hostx64\x64\link.exe /nologo CMakeProject1\CMakeFiles\CMakeProject1.dir\CMakeProject1.cpp.obj /out:cmakeproject1\cmakeproject1.exe /implib:cmakeproject1\cmakeproject1.lib /pdb:cmakeproject1\cmakeproject1.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeProject1\CMakeFiles\CMakeProject1.dir/intermediate.manifest CMakeProject1\CMakeFiles\CMakeProject1.dir/manifest.res" failed (exit code 1120) with the following output: C:\Users\mnagy\Source\CMakeProject1.cpp.obj : error LNK2019: unresolved external symbol "int cdecl five(void)" (?five@@yahxz) referenced in function main C:\Users\mnagy\Source\CMakeProject1\CMakeProject1.exe : fatal error LNK1120: 1 unresolved externals int five(); int main() { int a = five(); }

A törpök élete azonban nem csak játék és mese /usr/bin/c++ CMakeFiles/CMakeProject1.dir/CMakeProject1.cpp.o -o CMakeProject1 CMakeFiles/CMakeProject1.dir/CMakeProject1.cpp.o: In function `main': CMakeProject1.cpp:(.text+0x9): undefined reference to `five()' collect2: error: ld returned 1 exit status int five(); int main() { int a = five(); }

A törpök élete azonban nem csak játék és mese /usr/bin/clang++-7 -fuse-ld=lld CMakeFiles/CMakeProject1.dir/CMakeProject1.cpp.o - o CMakeProject1 ld.lld: error: undefined symbol: five() >>> referenced by CMakeProject1.cpp >>> CMakeFiles/CMakeProject1.dir/CMakeProject1.cpp.o:(main) clang: error: linker command failed with exit code 1 (use -v to see invocation) int five(); int main() { int a = five(); }

Fordítások típusa Debug Fejlesztés során használjuk Hibakeresés Végig lépkedhetünk minden függvényen, megakasztva a futást bárhol Lassú futás Pythonnál még mindig gyorsabb Release Kész program futtatásakor Itt már ne legyen hiba Nem lehet végig lépkedni a kódon, mert az optimizer ízekre szedte a binárist Gyors futás Ha nem írtunk le szamárságot Nem csak futásidőben van különbség! A kód maga is különbözik a két variáns között A nyelv szemantikája is változhat (!)

Build system Mert kézzel csak palacsintát fordítunk, programot nem

Mi a probléma ha kézzel fordítunk? A C++ programok meglehetősen sokáig fordulnak, várni pedig senki sem szeret Ha több fájlunk van, fejlesztés közben két választási lehetőségünk van: Minden alkalommal lefordítjuk az összes fájlt, azokat is amikhez nem nyúltunk, tehát az objektum fájljai sem változtak Minden alkalommal csak azt fordítjuk, amihez hozzányúltunk, kockáztatva hogy elrontjuk (rossz fájlt fordítunk) és aztán vakarjuk a fejünket, hogy nem változott semmi a programban, pedig kellett volna Vagy, írunk egy okos szkriptet!

Mi a probléma ha kézzel fordítunk? [String[]]$Sources = 'Hello.cpp','Other.cpp'; [String[]]$Objects = @(); foreach ($Source in $Sources) { $SourceTime = Get-Item $Source Select-Object -ExpandProperty LastWriteTime; $OutputName = (Split-Path -Path $Source -LeafBase) + ".o"; $Objects += $OutputName; if (Test-Path $OutputName) { $OutputTime = Get-Item $OutputName Select-Object - ExpandProperty LastWriteTime; } } if (($SourceTime -gt $OutputTime) -or -not (Test-Path $OutputName)) { Invoke-Expression -Command "cl.exe /nologo /EHsc /Fo: $OutputName /c $Source" }

Mi a probléma ha kézzel fordítunk? foreach ($Object in $Objects) { $ObjectTime = Get-Item $Object Select-Object -ExpandProperty LastWriteTime; $ExeName = "Hello.exe"; if (Test-Path $ExeName) { $ExeTime = Get-Item $ExeName Select-Object - ExpandProperty LastWriteTime; } if (($ObjectTime -gt $ExeTime) -or -not (Test-Path $ExeName)) { Invoke-Expression -Command "link.exe /nologo $($Objects -join " ") /out:$exename" } }

Mi a probléma ha kézzel fordítunk? PS C:\Users\mnagy>.\Build-Hello.ps1 Hello.cpp Other.cpp PS C:\Users\mnagy>.\Hello.exe Hello, world and others! Mi ezzel a probléma? Mi nem??? Nem skálázik Egy csomó dolgot nem vesz figyelembe Header fájl ideje? Hordozhatóság? Debug, release? Könyvtár függőségeket nem tudja kezelni Egy magon fordít Hibás a szkript (logikai hiba van benne, többek között)

Mi a probléma ha kézzel fordítunk? Az említésre méltó fordítók mind kicsit másképp működnek GNU Compiler Collection Clang/LLVM Microsoft Visual C++ Más kapcsolók, más környezet, más alapértelmezések, stb. Minimális ismeret idővel beszivárog az ember eszköztárába, nem árt legalább egyszer elolvasni, hogy milyen kapcsolói vannak a kedvenc fordítónknak esetleg a többinek is

Mi az a build system? Egy olyan eszköz, amely minimális felhasználói befektetéssel a lehető leggyorsabban lefordítja a programunkat A bemenet egy szöveges leíró fájl (make file) és a kimenete egy vagy több bináris (és egy elégedett felhasználó). Példák: GNU Make NMake MSBuild Ninja Qmake CMake

Miért használjak build systemet? Nem azt mondtam, hogy minimális felhasználói befektetéssel?! A céljuk, hogy a lehető legkényelmesebb legyen használni A felhasználó a mi -re koncentrál, nem a hogyan -ra Deklaratív leíró nyelv, nem imperatív Nem azt mondtam, hogy a lehető leggyorsabban?! Automatikusan detektálja a minimálisan elvégzendő munkát Főleg idő bélyegekkel dolgozik Az egymástól független feladatokat párhuzamosan végzi el Némi tanulást igényel, de hosszú távon megtérül!

Choosing a build system Build System Olvasható Grafikus felület Hordozható Generátor GNU Make NMake MSBuild ( ) Ninja Scons Waf Invoke-Build QMake CMake ( )

GNU Make SOURCES := t.cpp # Objs are all the sources, with.cpp replaced by.o OBJS := $(SOURCES:.cpp=.o) all: t # Compile the binary 't' by calling the compiler with cflags, lflags, and any libs (if defined) and the list of objects. t: $(OBJS) $(CC) $(CFLAGS) -o t $(OBJS) $(LFLAGS) $(LIBS) # Get a.o from a.cpp by calling compiler with cflags and includes (if defined).cpp.o: $(CC) $(CFLAGS) $(INCLUDES) -c $< Része a GNU nyílt-forrású szoftvereknek Minden Linux disztribúciónak része Felhasználó által definiált feladatok Feladat név Függőség Végrehajtandó parancs

NMake SOURCES := t.cpp # Objs are all the sources, with.cpp replaced by.o OBJS := $(SOURCES:.cpp=.o) all: t # Compile the binary 't' by calling the compiler with cflags, lflags, and any libs (if defined) and the list of objects. t: $(OBJS) $(CC) $(CFLAGS) -o t $(OBJS) $(LFLAGS) $(LIBS) # Get a.o from a.cpp by calling compiler with cflags and includes (if defined).cpp.o: $(CC) $(CFLAGS) $(INCLUDES) -c $< A Microsoft Visual Studio része Jobbára hagyaték Felhasználó által definiált feladatok Feladat név Függőség Végrehajtandó parancs Nem tud feladatokat párhuzamosan végrehajtani

MSBuild <?xml version="1.0" encoding="utf-8"?> <Project xmlns="http://schemas.microsoft.com/develo per/msbuild/2003"> <PropertyGroup><MyReleaseOutput>.\releas e</myreleaseoutput> </PropertyGroup> <ItemGroup> <MyReleaseFiles Include=".\bin\debug\*.*" /> </ItemGroup> <Target Name="Build"> <Message Text="Building msbuildintro" /> <MSBuild Projects="msbuildintro.csproj" Targets="Build" /> </Target> <Target Name="Release" DependsOnTargets="Build"> <MakeDir Directories="$(MyReleaseOutput)" /> <Copy SourceFiles="@(MyReleaseFiles)" DestinationFolder="$(MyReleaseOutput)" /> </Target> </Project> A Visual Studio jelenleg használt build systeme Most már nyílt-forrású és Linuxon is elérhető XML-alapú Korlátozottan olvasható Grafikus kezelő felülettel a legjobb használni

Ninja cflags = -Wall Werror rule cc command = gcc $cflags -c $in -o $out # If left unspecified, builds get the outer $cflags. build foo.o: cc foo.c # But you can shadow variables like cflags for a particular build. build special.o: cc special.c cflags = -Wall # The variable was only shadowed for the scope of special.o; # Subsequent build lines get the outer (original) cflags. build bar.o: cc bar.c Pokolian gyors Feláldozza az olvashatóságot Cserébe a gép gyorsan fel tudja dolgozni Generálásra szánták, nem írásra Hordozható Nyílt-forrású

QMake CONFIG += qt debug HEADERS += hello.h SOURCES += hello.cpp SOURCES += main.cpp win32 { SOURCES += hellowin.cpp } unix { SOURCES += hellounix.cpp }!exists( main.cpp ) { error( "No main.cpp file found" ) } win32:debug { CONFIG += console } Make fájl generátor Egyetlen bemenet Több kimeneti make fájl nyelv Hordozható Nyílt-forrású A Qt Project igényeit tartja szem előtt Qt6 elhagyja, cserébe

CMake PROJECT(my_app) LIST(SOURCES) APPEND(SOURCES main.cpp vector.cpp) ADD_EXECUTABLE(${PROJECT_NAME} SOURCES) Make fájl generátor Hordozható Nyílt-forrású Több nyelvet ismer Az ismert nyelveket kényelmes használni Nyelvek taníthatók is neki A szkript nyelve nem a legbarátságosabb A legtöbb cross-platform projekt ezt használja

Visual Studio Code A félelem haragot szül, a harag gyűlöletet, a gyűlölet kínt és szenvvvedééést... Yoda mester

Integrált Fejlesztői Környezet Mi is az az IDE? Integrated Development Environment, avagy integrált fejlesztői környezet Olyan eszközök gyűjteménye, melyek összhangban vannak egymással, megkönnyítve a szoftverfejlesztés különböző lépéseit úgy, hogy maximalizálják a munka hatékonyságát Milyen különböző lépések ezek? Forrás fájl szerkesztés, fordítás automatizálása, hibakeresés, verzió követés, tesztelés, profilozás, telepítő készítés és publikálás, stb. Bakker, de én egy fizikus vagyok, miért foglalkozzam ezzel? Pont azért!

Előnyök, hátrányok Integrált fejlesztői környezet Pro Elejétől a végéig automatizált Természetes a munkafolyamat Könnyű megtanulni, nehéz tökélyre vinni Con Avval főzünk, amink van Az IDE megválasztása fontossá válik A kiterjeszthetőség fontos Eszközlánc Con Külön eszköz mindenre Interfészelni kell őket Nem mindig zökkenőmentes Nehéz megtanulni, nehéz tökélyre vinni Kialakulnak munkafolyamatok (szkriptelés?) Pro Mindenből csak a legjobbat!

IDE haladók részére A Visual Studio Code fiatal Első kiadása: 2015 április 29. Nyílt forrás: 2015 november 18. Kereszt-platform támogatás Windows, Linux, OSX JavaScript és TypeScript alapok Kezdetben szövegszerkesztő Közösségi nyomásra megnyitották a beépülő modulok API-ját Azóta elképesztő fluxussal érkeznek a beépülő modulok

Telepítés https://code.visualstudio.com mnagy@matty-z50-75:~$ sudo dpkg -i code_1.6.1-1476373175_amd64.deb https://code.visualstudio.com/docs/setup/linux PS /home/mnagy> sudo apt install code PS C:\Users\mnagy> choco install visualstudiocode

Első pillantásra

Első pillantásra Oldalsáv Beépített funkciók gombjai találhatók itt Fájl nézet Keresés Git Debug Bővítmény ek

Első pillantásra Szerkesztő panel Itt töltjük a legtöbb fejlesztési időt Felosztható Fejléc Forrás Diff nézet

Használati módok Használható egyszerű szövegszesztőként is Fájlt megnyit, szerkeszt, ment, kilép Használható, mint egy nagy mértékben testre szabható, teljes értékű fejlesztői környezet Egy teljes mappa is megnyitható vele A globális beállítások platform-specifikus helyen tároltak A munkaterület-specifikus beállítások (a mappák, amiket megnyitottunk) helyben tároltak egy.vscode nevű mappában Akinek ez nem felel meg, az kövesse ezt a Github bejegyzést

Fájl nézet A fájl nézet gomb egy fa struktúrában megjeleníti a megnyitott mappa tartalmát A gyors azonosíthatóság jegyében ikon csomagok is letölthetők Fájl, Beállítások, Fájl ikon témák, Seti (pl.) CMake ikonokért ez a Github bejegyzés követhető Mappák összecsukhatók/lenyithatók igény szerint Dupla-klikkelve bármelyik fájl megnyitható a szerkesztőben 11/15/2016 65

Keresés A kereső gombbal kereshetünk a fájlok tartalmában (grep) akár reguláris kifejezések használatával is Írjunk be a kereső kifejezést tartalmat, hogy kapjunk egy listát minden fájllal, amely eleget tesz neki A kicserélés funkció a lenyitható háromszöggel hívható elő Az ikon a szövegdoboz alatt további keresési opciókat hoz elő 11/15/2016 66

Bővítmények A bővítmények gombbal: kereshetünk a piactérről új bővítményeket kezelhetjük a már telepített bővítményeket 11/15/2016 67

Bővítmények Bővítmények telepítéséhez: Kattintsunk a keresősávba Írjuk be a keresett kiterjesztés nevét, vagy a nevének egy részét Kattintsunk az Install gombra Várjuk meg, amíg befejezi a telepítést, majd kattintsunk a Reload gombra. Most ezekre a bővítményekre lesz szükségünk: C/C++ CMake CMake Tools 11/15/2016 68

Előkészületek Linuxon Feltételezem, hogy egy működő C/C++ fordító és linker már telepítve van a gépre és elérhető a $PATH-ból gcc/g++ clang/clang++ illetve lld Windowson Feltételezem, hogy egy működő C/C++ fordító és linker már telepítve van a gépre Standalone Visual C++ Build Tools (Build Tools for Visual Studio 2017 ) Visual Studio 2017 Community Edition (a nagytestvér Visual Studio + msvc) clang-cl illetve lld (letölthető innen)

Lássunk hozzá

Lássunk hozzá Csináljunk egy üres mappát, amiben majd fejleszteni kezdünk Windows-on a GUI shell kontextus menüjébe beépül VS Code, és tetszőleges mappa ikonjára vagy egy mappában üres területre jobb-klikkelve megjelenik egy Open with Code kontextus menü Linuxon parancssorból a `code /path/to/folder` szintaxissal nyitható meg egy mappa Programon belülről a nyitóképernyőről, illetve a Fájl menüből is nyitható mappa Kezdetben egy üres IDE fog bennünket fogadni, az egyes bővítmények gombjai akkor jelennek csak meg, ha megfelelő fájlok vannak a megnyitott mappában, vagy ha végrehajtjuk egy parancsát Először jóváhagyjuk a CMake Tools automatikus konfigurálását.

Lássunk hozzá A parancs palettát megnyitni Ctrl+Shift+P View menü majd Show Command Palette Ez megjeleníti majd az összes elérhető parancsot valamennyi bővítményből Írjuk be: CMake Utána válasszuk a Edit Kits file gombot

Lássunk hozzá Amikor a CMake kiterjesztés először aktiválódik, neki áll Kit - eket keresni Egy Kit az egy konform, CMake által ismert fordító N-esből és a hozzájuk kapcsolódó linkerekből, egyéb eszközökből áll. A bővítmény megkérdezi, hogy szeretnénk-e megnézni azt a JSON fájlt, amibe összegyűjtötte az általa talált Kiteket. Mondhatunk igen és nemet is Később a parancs palettáról ugyanúgy nyithatjuk meg ezt a fájlt a CMake: Edit CMake Kits parancs kiválasztásával Ha jóváhagytuk az eredményt a CMake: Quick Start parancsot választjuk és konfiguráljuk az első programunkat.

Egy pici fazonírozás Eredeti (csak MSVC detektálva) [ { "name": "Visual Studio Build Tools 2017 - amd64", "visualstudio": "66d7a7eb", "visualstudioarchitecture": "amd64", "preferredgenerator": { "name": "Visual Studio 15 2017", "platform": "x64" } }, { "name": "Visual Studio Build Tools 2017 - x86", "visualstudio": "66d7a7eb", "visualstudioarchitecture": "x86", "preferredgenerator": { "name": "Visual Studio 15 2017" } } ] Módosít (32-bitre nem fordítunk) [ { "name": MSVC 15.5.2", "visualstudio": "66d7a7eb", "visualstudioarchitecture": "amd64", "preferredgenerator": { "name": "Visual Studio 15 2017", "platform": "x64" } } ]

Lássunk hozzá Ezután a kiterjesztés három keresztkérdést fog feltenni, tudjuk-e mit is szeretnénk valójában Mi legyen a neve a kimeneti binárisnak? Könyvtár vagy futtatható program-e a kimenet? Debug, Release vagy valami cselesebb fordítási módot szeretnénk-e alkalmazni?

Repülő rajt Mi történt?

Repülő rajt Mi történt? A CMake Tools generált nekünk egy egyszerű main.cpp fájlt egy minimalista fordító szkriptet

Repülő rajt cmakelists.txt cmake_minimum_required(version 3.0.0) project(vscode_test VERSION 0.0.0) include(ctest) enable_testing() add_executable(vscode_test main.cpp) set(cpack_project_name ${PROJECT_NAME}) set(cpack_project_version ${PROJECT_VERSION}) include(cpack) main.cpp #include <iostream> int main(int, char**) { std::cout << "Hello, world!\n"; }

Repülő rajt cmakelists.txt cmake_minimum_required(version 3.0.0) project(vscode_test VERSION 0.0.0) include(ctest) enable_testing() add_executable(vscode_test main.cpp) set(cpack_project_name ${PROJECT_NAME}) set(cpack_project_version ${PROJECT_VERSION}) include(cpack) main.cpp #include <iostream> int main(int, char**) { std::cout << "Hello, world!\n"; } F7

Fordítás Mi történt?

Fordítás Mi történt? CMake Tools Konfigurál Generál CppTools Észleli a CMake bővítményt Megkérdezi használja-e

Fordítás Mi történt? CMake Tools Konfigurál Generál CppTools Észleli a CMake bővítményt Megkérdezi használja-e

Fordítás Mi történt? CMake Tools Konfigurál Generál CppTools Észleli a CMake bővítményt Megkérdezi használja-e Látjuk a parancssort, hogy mi történt

Hiba keresés (Cpp Tools módra) Nyomjuk meg az F5-öt Minden bővítmény és beépített képesség megkérdi, mit szeretnénk tenni a gyorsbillentyű lenyomásakor Linuxon Válasszuk a C++ (GDB/LLDB) lehetőséget GCC vagy Clang használatához Windowson Válasszuk a C++ (Windows) lehetőséges MSVC használatához Válasszuk a C++ (GDB/LLDB) lehetőséget Clang használatához

Hiba keresés (Cpp Tools módra) Amikor először szeretnénk egy programot elindítani hibakeresés céljából, meg kell mondani a C++ bővítménynek hova került az futtatható állomány Ez a rész fölösleges, ha magával a CMake Tools-zal indítjuk a hiba keresést (köv. dia) Alapértelmezetten ${workspaceroot}/build/<project_name>

Hiba keresés (CMake Tools módra) Mivel a CMake Tools tudja hova kerülnek a binárisok és azt is tudja milyen fordítóval fordítottunk (tehát azt is, milyen hiba kereső képes a binárisokban turkálni), ezért képes a korábbi beállításokat megspórolni nekünk Bővítmények közti kommunikációt használ A parancs palettáról hívjuk elő a következő parancsot Ezután ha kiválasztottuk az egyetlen futtatható állományunkat, megjelenik egy gomb a státusz sávon Erre nyomva elindul a hiba keresés

Hiba keresés Pár sor kódot hozzáadva a forráshoz izgalmasabb lesz a hiba keresés A sor számok bal oldalára kattintva megakasztási pontok helyezhetők el Amikor a program végrehajtása ezekhez a pontokhoz ér megáll, hogy szemügyre vehessük az állapotát

Hiba keresés Ha újból megnyomjuk az F5 gombot, akkor most már (és ezután mindig) rendesen elindul a hiba keresés Ha az egeret változók fölé visszük, megtekinthetjük azok aktuális értékét

Hiba keresés Ha újból megnyomjuk az F5 gombot, akkor most már (és ezután mindig) rendesen elindul a hiba keresés Ha az egeret változók fölé visszük, megtekinthetjük azok aktuális értékét A középső panelen a következő parancsok láthatók Ugrás a következő pontra (F5) Állítás átlépése (F10) Állításba lépés (F11) Állításból kilépés (Shift+F11) Újraindítás (Ctrl+F5) Menet leállítása (Shift+F5)

Hiba keresés Helyi változók Hívás verem

Verzió követés A Git a legelterjedtebb verziókövető rendszer napjainkban Kifejezetten hasznos, ha szeretnénk visszatérni a programkód egy korábbi változatára használni egy működő verziót, amíg fejlesztünk egy új képességet együttműködni másokkal ugyanazon a kódbázison A Git mélyreható elsajátítása a Kutatómunka Információs Eszközei c. tárgyon történik

Verzió követés A Git-et olyan sok programnyelv művelője használja, hogy beépített funkció a Visual Studio Code-ban A CMake Quick Start projektünket eddig nem követtük Gittel Ha megnyitjuk a verziókövető menüpontot, git repot csinálhatunk a gyökér mappából Kezdetben nincs verziókövetés Kattintsunk a Initialize git repository gombra

Verzió követés Ezt követően kismillió fájlt detektál majd a Git, ami még nem szerepel a repoban Ez azért van, mert az alapértelmezett fordítási helyet használtuk, és a gyökérmappában lévő build mappába került minden fordítási mellékhatás Ugyan a keletkező binárisok nem teljesen kerülnek átfedésbe a forrás fájlokkal (insource fordítás), mégsem a legszebb gyakorlat Szebb volna egy teljesen külön helyre fordítani (out-of-source fordítás)

Verzió követés Visszatérve a verziókövető fülre, most már csak az általunk létrehozott fájlok szerepelnek, mint új fájlok Amennyiben másokkal együtt kollaborálunk vagy szeretnénk közzétenni a munkánkat, úgy a környezet-specifikus fájlokat is ki illik zárni a verziókövetésből.vscode/.gitignore (magát a.gitignore-it is ki lehet zárni) Adjunk egy rövid megjegyzést a commithoz A gomb megnyomásával kész az első commit Gratulálunk, kész az első Git repo Codeban!

Verzió követés A legtöbb Git parancs elérhető a Parancs Palettáról Ha beírjuk, hogy Git, akkor kilistázódik az összes Git parancs, amit a szerkesztő ki tud adni helyettünk A tavalyi diákon megtalálható a tipikus Git munkafolyamat és mikor érdemes használni azt A többletmunka amit a Git jelent már közepes méretű projekteknél is megtérül Ha bizton szeretnénk tudni a kódot Tartsuk a repot olyan mappában, amit egy felhős tárhelyszolgáltató is követ Időnként toljuk ki a munkát egy megbízható távoli kiszolgálóra