Programmering i C++ Kompilering från kommandoraden



Relevanta dokument
TDP005 Projekt: Objektorienterat system

IDA kursmaterial Informationsblad make. make

prog: prog.c gcc -g -Wall prog.c /usr/local/bib/c/58an/modules/modul.o -o prog

TDP005: Introduktion till Make

Objektorienterad programmering i Java I

Så här skriver du ditt första program i C++

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

Föreläsning 3. Programmering, C och programmeringsmiljö

Hur man kompilerar och kör IT++-program med MinGW. 1 Sammanfattning. 2 Om dokumentet. 3 Om min konfiguration

Program. Kapitel make Program Interpreterande och kompilerande program

Det finns många flaggor till g++,

Inledande programmering med C# (1DV402) Introduktion till C#

Introduktion till programmering, hösten 2011

Föreläsning 3. Programmering, C och programmeringsmiljö

Föreläsning 2. Operativsystem och programmering

Editering, Kompilering och Exekvering av Javaprogram

Instruktioner för att kunna programmera på skolans datorer

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Eclipse. Avsikt. Nu ska ett fönster liknande figuren till höger synas.

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

Datorer och datoranvändning Föreläsningar 2014/15. Föreläsning 1 Unix. Operativsystem. Unix

1 Språket C Valet av språket C++ för kompendiet. 1.2 Språket. 1.3 Att programmera. 1.4 Hello World Börja programmera

Verktyg och Utvecklingsmiljö. Föreläsning 2 Eclipse

NetBeans 5.5. Avsikt. Projektfönster

Övning 1. Datateknik A, Java I, 5 poäng. Att ladda hem och installera Java Att skriva ditt första Javaprogram Att kompilera och exekvera ditt program

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Programmering: att instruera en maskin att utföra en uppgift, kräver olika språk:

Operativsystem och användargränssnitt

Grundkurs i programmering - intro

Här beskrivs Eclipse, den programutvecklingsmiljö som utnyttjas i programmeringskurserna. Mera information finns på:

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

Laboration 1 Introduktion till Visual Basic 6.0

Boken?!?! Vad är ett program? Kompilerande-Interpreterande Programmeringsmiljö Hello World! Att programmera och ett enkelt program Variabler printf

Emacs. Eric Elfving Institutionen för datavetenskap (IDA) 22 augusti 2016

Att komma igång. Föreläsning 1

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

A ToolGuide for Eclipse: En fördjupning i några av verktygen i Eclipse och hur de underlättar XP s practices

NetBeans 7. Avsikt. Projektfönster

Kapitel 11. Program Att köra program Skript Interpreterande och kompilerande programspråk Att kompilera program

Kompilera och exekvera Javakod

PROV. 12 Egenskaper (provavsnitt)

1 Logga in 1. 2 Byta lösenord 1. 3 Hemkatalog 1. 4 Unixintroduktion Viktiga kommandon Läsa 3

SKAPA DET FÖRSTA PROJEKTET I mikrobasic PRO for AVR

Objektorienterad programmering Föreläsning 2

Verktyg och Utvecklingsmiljö. Jochim von Hacht

INSTALLATION OCH KONFIGURATION AV PROGRAM PICBASIC PRO - MICRO CODE STUDIO PLUS - EPIC PLUS

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Laboration 10 - Eclipse

Eclipse en handledning

Inledande programmering med C# (1DV402) Ditt första C#-program med Visual Studio

Att komma igång. Föreläsning 1

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Eclipse. Kort genomgång

emopluppen Användning av "Ant" Niklas Backlund Version: 1.4 ( 2002/04/26 07:27:52 UTC)

Omkoppling av in- och utmatning. In- och utmatning i Unix. Kommando exempel, ls, pipe forts. Kommando exempel, ls, pipe

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Lektion 1 - Steg 1. Introduktion. Hello World

Lab1 Introduktion. 1 Syfte. 2 Innehåll Win32API Skapa trådar Kritiska sektioner Mailslothantering. 3 Förberedelse & Tips

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

Föreläsning 1. Presentation av kursen Vad är programmering? Lite om java och utvecklingsmiljöer Aktivitetsdiagram Ett första program

DRAFT. CVS kurs laboration 1 Checka in, ut och uppdatera. Marcus Rejås. 17 november 2002

Kapitel 11. Program Skript Att köra program Interpreterande och kompilerande programspråk

GitHub for Windows och GitShell

Introduktion till programmering D0009E. Föreläsning 1: Programmets väg

Avslutning. Kapitel Komprimering av filer

C-programmering, föreläsning 1 Jesper Wilhelmsson

Datorlaboration 0, Programmering i C++ (EDA623)

CVS-Introduktion. CyberRymden Introduktion till CVS,17 november (27) Marcus Rejås

Programutveckling med Java Development Kit. (JDK 1.1.x) och Programmers File Editor (PFE 7.02)

TDIU01 (725G67) - Programmering i C++, grundkurs

UTVECKLINGSVERKTYG. Praktiska tips för PUM-projekten

kommando -fl argument

Föreläsning 1 Unix. Datorer och datoranvändning Föreläsningar 2018/19. Operativsystem. Unix

TDP005. Föreläsning 2. Filip Strömbäck

Att komma igång. Föreläsning 1

Lektion Java Grunder. Javas historia. Programmeringsspråket Java. Skillnaderna mellan Java och C++ JVM (Javas Virtuella Maskin)

Introduktion till programmering. Programspråk och paradigmer

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

L A T E X. Eric Elfving Institutionen för datavetenskap (IDA) 4 september 2015

Introduktion till algoritmer - L0 - Grunder i C++ Matematikgymnasiet, Läsåret L0 - Grunder i C++

Lite mer om CGI-programmering

grundläggande C++, funktioner m.m.

2 Eclipse en handledning

Använda Python Laboration 1 GruDat, DD1344

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Installation/uppgradering av Agfa IMPAX program för remittenter

TDP005, Projekt: objektorienterade system

Värmedistribution i plåt

Versionshantering med Git. Henrik Henriksson 17 april 2018

LaTeX. Grunderna till dokumentsystemet LaTeX. Eric Elfving Institutionen för Datavetenskap (IDA)

Handbok KWrite. T.C. Hollingsworth Christoph Cullmann Översättare: Stefan Asserhäll

Introduktion till Matlab

OOP Objekt-orienterad programmering

Introduktion till programmering och Python Grundkurs i programmering med Python

Kapitel 12. Mer om program Att rapportera buggar och problem make

Konstruktion av kommando och generell funktion för att anropa sorteringsalgoritmer samt Subversion versionshantering.

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Eclipse en handledning

TDP005, Projekt: Objektorienterade System. Laboration: Eclipse

Föreläsning 5 5DV086 - Programspråk

Transkript:

Programmering i C++ Kompilering från kommandoraden Sven Gestegård Robertz Datavetenskap, LTH 9 november 2015 Sammanfattning Ibland vill man, av olika anledningar, inte använda en stor integrerad utvecklingsmiljö (IDE), med den extra komplexitet det innebär, utan kompilera sin källkod direkt från kommandoraden. Detta kan ha fördelen att man enkelt kan ge olika flaggor direkt till kompilatorn, i stället för att behöva ändra inställningar i projekt, etc. Vad som är smidigast är ytterst en smaksak, och beror även på vilken storlek projektet har, och i vilken fas av utvecklingen man är. Detta dokument försöker ge en introduktion till hur man kan kompilera sin källkod direkt från kommandoraden genom att dels anropa kompilatorn direkt, och dels använda bygg-verktyget make. Dokumentet förutsätter en unix-liknande miljö, vilket inkluderar Linux och MacOS. En liknande miljö kan fås under Windows med t ex Cygwin. 1 Inledning När man programmerar i en integrerad utvecklingsmiljö (IDE, Integrated Development Environment) som Eclipse eller Visual Studio så är alla verktyg man använder när man skriver, bygger, testar och felsöker program samlade i ett användargränssnitt. Vi ska nu i stället se hur man kan använda dessa delar var för sig. Detta betyder att vi kommer att skriva program i en valfri text-editor, kompilera källkoden med en kompilator, direkt från kommandoraden, och exekvera programmet från kommandoraden. Därutöver kan man använda byggverktyg (som t ex make) för att hantera beroenden mellan komponenter. Detta dokument ger en första introduktion, med små exempel, till hur man kan arbeta med C++-program utan att använda en IDE. De exempel som ges ska ses som axplock för att hjälpa läsaren över den första tröskeln, men många detaljer utelämnas. För närmare information hänvisas till dokumentationen för respektive verktyg. 1

Vad gäller text-editorer finns det olika sorters text-editorer avsedda för programmering, och som passar olika människor. Det går inte att ge några generella rekommendationer, utan var och en får prova sig fram och bilda sig en egen uppfattning om vad som fungerar bäst. 2 Att anropa kompilatorn direkt från kommandoraden I detta avsnitt kommer gcc att användas som exempel. Andra kompilatorer, som t ex clang fungerar på liknande sätt. Ett minimalt exempel Om vi antar at vi har en källkodsfil hello.cpp, så kan vi kompilera den till en exekverbar fil genom att ge kommandot 1 > g++ hello.cpp Om kompileringen och länkningen går bra kommer den exekverbara filen att skapas med namnet a.out (eller a.exe under Windows/Cygwin). För att ange namnet på den exekverbara filen som ska skapas använder man optionen -o <filnamn>, t ex > g++ -o hello hello.cpp För att exekvera den genererade filen (hello) ger man kommandot >./hello Kompileringsflaggor För att ändra hur kompilatorn arbetar ger man flaggor och argument på kommandoraden. Några exempel: -std anger vilken standard av språket som ska användas. För att använda C++11 skriver man -std=c++11. -W anger vilka varningar som ska användas. För att slå på alla varningar skriver man -Wall -g anger att kompilatorn ska generera debug-symboler, så att man kan få mer information om källkoden när man kör sitt program i en debugger. -O anger vilken grad av optimering kompilatorn ska använda. -O0 betyder utan optimering. Det normala är -O2 eller -O3. En normal kommandorad för att kompilera sitt program är > g++ -std=c++11 -g -Wall -o hello hello.cpp 1 I de exempel som ges kommer följande notation att användas: Kommandoprompten som används är >, vilket betyder att detta betyder att användaren skriver g++ hello.cpp följt av <ENTER>. 2

3 byggverktyget make Verktyget make är ett mycket kraftfullt verktyg för att bygga program och hantera beroenden mellan källkodsfiler, så att endast de filer som ändrats kompileras om. Ett byggverktyg är nödvändigt för att bygga stora system, men det är även smidigt för att beskriva kompilering av enskilda filer eller små system, för att slippa skriva långa kommandorader för varje kompilering. make fungerar så att reglerna för hur bygget ska göras finns i filen Makefile, i samma katalog som källkodsfilerna. En Makefile innehåller en uppsättning regler. Exemplet i figur 1 betyder att filen target beror av filerna dependency_1, dependency_2 etc. Om filen target inte finns, eller om någon av dependency_k är nyare än target, så kommer make att köra sekvensen av kommandon command_1, command_2, etc. target: dependency_1 dependency_2... dependency_n command_1 command_2... command_n Figur 1: Syntax för regler i en Makefile. OBS! rader som innehåller de kommandon, som hör till en regel, inleds med ett tab-tecken, och inte åtta space. I Exemplet här betyder det att de indragna rader med command_k inleds med ett tab-tecken. Att råka göra indraget med space i stället för tab är ett väldigt vanligt fel när man skriver Makefiler, så var nogrann med det. Exempel Till exempel, kan en Makefile som beskriver hur man bygger programmen hello och test se ut som i figur 2. hello : hello.cpp g++ $(CXXFLAGS) -o hello hello.cpp test : test.cpp test.h my_lib.h g++ $(CXXFLAGS) -o test test.cpp Figur 2: En enkel Makefile. Notera hur variabler (t ex CXXFLAGS) kan användas, samt hur test även har beroenden till två header-filer. 3

Generella regler, wildcards För att slippa skriva väldigt många nästan likadana regler, kan man skriva generella regler genom att använda mönstermatchning. En enkel standard-makefile, som kompilerar varje filnamn.cpp till en exekverbar fil filnamn kan se ut som i figur 3. % : %.cpp g++ $(CXXFLAGS) -o $@ $< Figur 3: Makefile som använder mönstermatchning. Variabeln CXXFLAGS innehåller de flaggor som ska ges till c++-kompilatorn, och de automatiska variablerna $@ och $< som innehåller resultatet (target) respektive det första beroendet. Tecknet % är ett jokertecken (wildcard) som matchar ett godtyckligt mönster. Med en Makefile enligt figur 3 betyder det att om man ger kommandot > make hello så kommer jokern % att matcha strängen hello, och alltså kommer $@ resp $< att innehålla strängarna hello resp hello.cpp. Detta betyder att make ska bygga filen hello, som beror av filen hello.cpp. Som resultat kommer kommandoraden g++ $(CXXFLAGS) -o hello hello.cpp att exekveras (om filen hello inte finns, eller om hello.cpp är nyare än hello. Notera att i figur 3 så beror den exekverbara filen (t ex hello) bara av källkodsfilen (t ex hello.cpp) men inte av några header-filer. Det betyder att om man gör en ändring i t ex hello.h och därefter gör make så kommer hello inte att byggas om. Det finns flera olika system för att hantera sådana beroenden, men de är för komplicerade för att beskrivas här. För små system är det enklaste att helt enkelt skriva explicita regler för varje kommando. Inbyggda regler Make har även inbyggda regler för många programspråk, och variabler som styr vilken kompilator som ska användas och vilka flaggor den få. Vår generella Makefile i figur 3 har regler för C++ som täcks av de inbyggda reglerna. Då räcker det att definiera variablerna CXX och CXXFLAGS. Några regler behöver inte anges (figur 4). På samma sätt som i figur 2, så vill man ibland ange fler beroenden för ett program, än enbart källkodsfilen med samma namn och ändelsen.cpp. För att bara ange beroendena, men använda standard-reglerna för hur filen ska byggas, så skriver man bara beroendena men inte några kommandon, som i figur 5. 4

CXX=g++ Figur 4: Makefile utan några regler. Variablerna (vars namn är standardiserade) styr hur de inbyggda reglerna arbetar. I detta exemplet sätts CXX, som anger vilket kommando som ska användas för att kompilera C++-filer, och CXXFLAGS, som anger vilka flaggor som ska ges på kommandoraden till $CXX. CXX=g++ test : test.cpp test.h my_lib.h Figur 5: Makefile som anger beroenden men använder standard-reglerna för att bygga filerna. Med en Makefile enligt figur 5 kommer kommandot > make hello bara att bygga hello om filen saknas eller hello.cpp är nyare. Däremot kommer kommandot > make test även att bygga test även om någon av filerna test.h och my_lib.h är nyare. A MacOS Kort om att installera kompilator På en nyare MacOS är det enklaste att installera XCode. Alternativt kan man installera gcc (och ev. make), t ex via MacPorts, som är en pakethanterare för att installera open-source program under MacOS (www.macports.org). Linux Många linux-distributioner inkluderar gcc som standard Annars får man installera paketen som innehåller gcc och make. I debian-baserade distributioner (Debian, Ubuntu, etc.) heter paketen gcc respektive make. I redhat-baserade distributioner (t ex Fedora) behöver man paketen gcc och gcc-c++ samt ev make. I andra borde de heta något liknande. Windows Under Windows är Cygwin (www.cygwin.com/) ett bra alternativ för att få en kommandoradsmiljö, kompilator 2 och verktygsprogram som liknar POSIX- /Unix. Cygwin är en pakethanterare, ungefär som MacPorts. 2 Tyvärr verkar den kompilator som finns som officiellt paket i Cygwin vara en gammal version av gcc (4.6). 5