Iniziare a programmare in C o C++ su Ubuntu

15 12 2007

Per la serie “Iniziare a programmare in…” ecco a voi un nuovo capitolo. Oggi vedremo come iniziare a programmare in C o in C++. Vedremo nello specifico come poter programmare con questi due linguaggi, secondo la standard ANSI (ovvero la vera versione del linguaggio, non quelle modificate dalle aziende per i loro comodi).

c_cpp.png

Il blog si è trasferito su www.blog.tugulab.org

Avvertenze: il seguente manuale è stato pensato e testato per essere usato su una Ubuntu 7.10 Gutsy Gibbon. Questo vuol dire che su versioni o distribuzioni ci potrebbero essere alcuni accorgimenti da tenere in considerazione.
Quindi attenzione a ciò che fate!

Come hanno consigliato a me, a mio tempo, vi consiglierò anche io di seguire lo standard. Poichè è solo senguendo questa strada che si possono fare programmi in cui si sa esattamente quello che il vostro codice fa sulla macchina, dato che uno standard è tutto documentato. Inoltre, non siete obbligati ad usare specifici compilatori che potrebbero restringere la vostra libertà, imponendovi l’uso di determinati sistemi operativi o architetture, oltre alla possibilità di trovarvi nella situazione di pagare una licenza…

Quindi per evitare tutto questo, studiate il C o il C++ ANSI e utilizzate un compilatore come gcc (e soci) che oltre ad essere *ottimo* è pure open source.

»Preparazione

Dobbiamo preparare la nostra Ubuntu a compilare i nostri programmi, quindi installiamo un set di compilatori e librerie utili alla programmazione C/C++, con un unico comando:
sudo aptitude install build-essential

A questo punto siamo pronti per iniziare!

»Il turno del C

Ora proveremo a scrivere il nostro primo programma in C, quindi aprite un editor di testo, ad esempio gEdit e scrivete queste linee di codice:
#include <stdio.h>
int main(void){
printf("Hello Tugu!\n");
return 0;
}

Quindi salvatelo nella directory /home (quella predefinita) dandogli un nome a piacere, ma con estenzione .c, in questo esempio utilizzeremo hellotugu.c
Apriamo un Terminale, in cui digiteremo le seguenti linee di codice per compilare il nostro programma ed eseguirlo:
gcc -Wall -g hellotugu.c -o hellotugu
./hellotugu

Cosa abbiamo fatto? Abbiamo chiamato il compilatore gcc (compilatore su cui è cresciuto Linux, scritto dal gruppo GNU, tant’è che gcc significa GNU Compiler Collection) dandogli diversi parametri:

  • -Wall che ci segnala tutti gli errori non critici, che sì non compromettono la compilazione del nostro programma, ma che sarebbe meglio correggere. Se vi cimenterete nelle studio del linguaggio imparerete sicuramente cosa sono i Warning
  • -g hellotugu.c gli dice che file compilare
  • -o hellotugu dice che nome deve avere il file compilato (quello che potremo eseguire)

Dopo questo comando, se non vi è nessun output da parte del compilatore significa che la compilazione è andata a buon fine, altrimenti vi segnala dov’è l’errore ed eventualmente il motivo.

Nota: ci sarebbe stata anche la possibilità di compilare con il comando gcc hellotugu.c, ma lo sconsiglio, questa forma la ritengo personalmente più razionale.

Nella seconda riga abbiamo eseguito il programma con il comando ./nome_eseguibile. Cosa significa “./ “?? Significa directory corrente, quindi il comando significa “esegui il file nome_eseguibile nella directory corrente“.
E in fine abbiamo l’output del nostro programma.

»Il turno del C++

Apriamo un editor di testo, ad esempio gEdit e scriviamo questo codice:
#include <iostream>
using namespace std;
int main(void){
cout << "Hello Tugu!\n";
return 0;
}

Chiudiamo e salviamo con nome, anche qui, a piacere, ma con estensione .cpp. Noi utilizzeremo hellotugu.cpp per questo esempio.
Ora compiliamo ed eseguiamo:
g++ -Wall -g hellotugu.cpp -o hellotugu
./hellotugu

Come sopra, con la prima compiliamo e con la seconda eseguiamo. Citando da sopra ecco cosa facciamo in dettaglio con questi comandi.
Abbiamo chiamato il compilatore g++ (compilatore per il C++, scritto dal gruppo GNU, all’interno della suite gcc) dandogli diversi parametri:

  • -Wall che ci segnala tutti gli errori non critici, che sì non compromettono la compilazione del nostro programma, ma che sarebbe meglio correggere. Se vi cimenterete nelle studio del linguaggio imparerete sicuramente cosa sono i Warning
  • -g hellotugu.cpp gli dice che file compilare
  • -o hellotugu dice che nome deve avere il file compilato (quello che potremo eseguire)

Dopo questo comando, se non vi è nessun output da parte del compilatore significa che la compilazione è andata a buon fine, altrimenti vi segnala dov’è l’errore ed eventualmente il motivo.

Nota: ci sarebbe stata anche la possibilità di compilare con il comando g++ hellotugu.cpp, ma lo sconsiglio, questa forma la ritengo personalmente più razionale.

Nella seconda riga abbiamo eseguito il programma con il comando ./nome_eseguibile. Cosa significa “./ “?? Significa directory corrente, quindi il comando significa “esegui il file nome_eseguibile nella directory corrente“.

»Utilizziamo un IDE per programmare

L’ultima chicca della giornata è Geany. Un IDE (Integrated Development Environment – Ambiente Integrato di Sviluppo), ovvero un programma che comprende molte utilità che ci aiutano nello sviluppo, rendendolo più veloce e meno difficoltoso.

Lo installiamo digitando nel terminale questo comando (bisogna attivare i repository Extra):
sudo aptitude install geany

A questo punto potete riaprire uno dei programmi creati con Geany e compilarli con F8 (talvolta con F9) ed eseguirli con F5. Molto più rapido.

hellotugucpp_geany.png

Ora non rimane che augurarci, buona fortuna!

Il blog si è trasferito su www.blog.tugulab.org

»Link utili

Annunci

Azioni

Information

19 responses

21 01 2008
beppe

mi esce fuori sta cosa qua..anche se il sorgente l’ho copia/incollato da questa guida..

faccio gcc -Wall -g esempio.cpp -o esempio
e poi ecco:

In file included from /usr/include/c++/4.1.3/backward/iostream.h:31,
from esempio.cpp:1:
/usr/include/c++/4.1.3/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the header for the header for C++ includes, or instead of the deprecated header . To disable this warning use -Wno-deprecated.
/tmp/ccKWDMHg.o: In function `__static_initialization_and_destruction_0′:
/usr/include/c++/4.1.3/iostream:76: undefined reference to `std::ios_base::Init::Init()’
/tmp/ccKWDMHg.o: In function `__tcf_0′:
/usr/include/c++/4.1.3/iostream:76: undefined reference to `std::ios_base::Init::~Init()’
/tmp/ccKWDMHg.o: In function `main’:
/home/beppe/Desktop/esempio.cpp:5: undefined reference to `std::cout’
/home/beppe/Desktop/esempio.cpp:5: undefined reference to `std::basic_ostream<char, std::char_traits >& std::operator<< <std::char_traits >(std::basic_ostream<char, std::char_traits >&, char const*)’
/tmp/ccKWDMHg.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0′
collect2: ld returned 1 exit status

6 04 2010
jollyr0ger

Ciao @beppe. Il problema è semplice: stai cercando di usare gcc per compilare un file in c++. Gcc funziona con i file in C solamente.
Devi utilizzare g++ invece per compilare i C++, quindi:
g++ -Wall -g hellotugu.cpp -o hellotugu

PS nella guida, se guardi meglio, c’è scritto proprio così 😉 Solo una distrazione

22 01 2008
jollyr0ger

devi assicurarti che il codice del programma sia uguale a quello postato.
Questo errore lo capirei se avessi usato la vecchia libreria c++ (per intenderci quella .h), ma se hai utilizzato iostream non dovrebbero esserci problemi…

22 01 2008
Cristian

x beppe

L’errore ti salta fuori perchè hai compilato un programma in c++ (estensione .cpp) con il compilatore gcc che è per programmi scritti in c (estensione .c).
Se invece usi il compilatore g++ l’errore non ti salta più fuori…

Buona programmazione, ciao!!

25 01 2008
beppe

Grazie a voi ho risolto 😀

sbagliavo compilatore.
ciao!

27 02 2008
elehan

come posso eseguire da shell (ubuntu 7.10) il programma (in c) compilato? basta che una volta creato file.exe scriva sulla riga di comando “file”? perchè mi dice command not found e di sicuro… ha ragione lui.
grazie!

27 02 2008
jollyr0ger

allora come postato nella guida prima devi aprire la shell, poi ti dirigi nella cartella dove hai il sorgente. A questo punto digiti: gcc -Wall -g nome_sorgente.c -o nome_eseguibile
questo comando servirà a compilare e crearti il file eseguibile (non necessariamente .exe, può avere qualsiasi nome)
per eseguire il programma devi dare: ./nome_eseguibile
Nota che davanti a nome_eseguibile c’è un punto e slash “./”

Così dovresti riuscirci

9 03 2008
gianted

Nell’esempio scritto in C, bisogna fare attenzione alle virgolette copiate dal codice (“”, al posto di ””). Nell’esempio bisogna inserire “Hello Tugu!\n”, anziché ”Hello Tugu!\n” (altrimenti gcc restituise un errore di compilazione).

Ciao,
gianted

9 03 2008
gianted

PS. Ho rivisto la mia risposta di poco fa pubblicata: a quanto pare le virgolette “dritte” vengono reinterpretate dall’applicazione che pubblica sul web. Quindi meglio inserirle a mano che copiarle.

Ciao.

10 03 2008
jollyr0ger

grazie per il tuo appunto 😉

12 03 2008
andrea

io con ubuntu 7.10 compilando con:

g++ -Wall -g Provacpiupiu.cpp -o prova

ho il seguente errore:

Provacpiupiu.cpp: In function ‘int main()’:
Provacpiupiu.cpp:12: error: no match for ‘operator>>’ in ‘std::cin.std::basic_istream::operator>> [with _CharT = char, _Traits = std::char_traits](((int&)(& anni))) >> std::endl’
/usr/include/c++/4.1.3/istream:131: note: candidates are: std::basic_istream& std::basic_istream::operator>>(std::basic_istream& (*)(std::basic_istream&)) [with _CharT = char, _Traits = std::char_traits]
/usr/include/c++/4.1.3/istream:134: note: std::basic_istream& std::basic_istream::operator>>(std::basic_ios& (*)(std::basic_ios&)) [with _CharT = char, _Traits = std::char_traits]
/usr/include/c++/4.1.3/istream:137: note: std::basic_istream& std::basic_istream::operator>>(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits]
/usr/include/c++/4.1.3/istream:169: note: std::basic_istream& std::basic_istream::operator>>(bool&) [with _CharT = char, _Traits = std::char_traits]
/usr/include/c++/4.1.3/istream:172: note: std::basic_istream& std::basic_istream::operator>>(short int&) [with _CharT = char, _Traits = std::char_traits]
/usr/include/c++/4.1.3/istream:175: note: std::basic_istream& std::basic_istream::operator>>(short unsigned int&) [with _CharT = char, _Traits = std::char_traits]
/usr/include/c++/4.1.3/istream:178: note: std::basic_istream& std::basic_istream::operator>>(int&) [with _CharT = char, _Traits = std::char_traits]
/usr/include/c++/4.1.3/istream:181: note: std::basic_istream& std::basic_istream::operator>>(unsigned int&) [with _CharT = char, _Traits = std::char_traits]
/usr/include/c++/4.1.3/istream:184: note: std::basic_istream& std::basic_istream::operator>>(long int&) [with _CharT = char, _Traits = std::char_traits]
/usr/include/c++/4.1.3/istream:187: note: std::basic_istream& std::basic_istream::operator>>(long unsigned int&) [with _CharT = char, _Traits = std::char_traits]
/usr/include/c++/4.1.3/istream:191: note: std::basic_istream& std::basic_istream::operator>>(long long int&) [with _CharT = char, _Traits = std::char_traits]
/usr/include/c++/4.1.3/istream:194: note: std::basic_istream& std::basic_istream::operator>>(long long unsigned int&) [with _CharT = char, _Traits = std::char_traits]
/usr/include/c++/4.1.3/istream:198: note: std::basic_istream& std::basic_istream::operator>>(float&) [with _CharT = char, _Traits = std::char_traits]
/usr/include/c++/4.1.3/istream:201: note: std::basic_istream& std::basic_istream::operator>>(double&) [with _CharT = char, _Traits = std::char_traits]
/usr/include/c++/4.1.3/istream:204: note: std::basic_istream& std::basic_istream::operator>>(long double&) [with _CharT = char, _Traits = std::char_traits]
/usr/include/c++/4.1.3/istream:207: note: std::basic_istream& std::basic_istream::operator>>(void*&) [with _CharT = char, _Traits = std::char_traits]
/usr/include/c++/4.1.3/istream:230: note: std::basic_istream& std::basic_istream::operator>>(std::basic_streambuf*) [with _CharT = char, _Traits = std::char_traits]
/usr/include/c++/4.1.3/istream:730: note: std::basic_istream& std::operator>>(std::basic_istream&, _CharT2*) [with _CharT2 = char, _Traits2 = std::char_traits, _CharT = char, _Traits = std::char_traits]
/usr/include/c++/4.1.3/istream:78: note: std::basic_istream& std::operator>>(std::basic_istream&, _CharT2&) [with _CharT2 = char, _Traits2 = std::char_traits, _CharT = char, _Traits = std::char_traits]

12 03 2008
andrea

a seguito di un banale programma :

#include

using namespace std;
int main ()
{
int anni=0;
cout<<“Inserisci un numero “<>anni>>endl;
cout<<” Il numero e’ “<<anni<<endl;
return 0;
}

12 03 2008
andrea

l’include c’è inserito ed è :

#include

12 03 2008
andrea

quello precedente l’ho risolto.

Invece dei problemi a far funzionare questo:

#include
#include

using namespace std;

int main()
{
set a;
a.insert(4);
for(a::iterator pos =a.begin; pos!=a.end; pos++)
{
cout<<“Il valore inserito e'”<< *pos<<endl;
}
}

che mi da i seguenti errori:

Provacpiupiu.cpp: In function ‘int main()’:
Provacpiupiu.cpp:10: error: ‘a’ is not a class or namespace
Provacpiupiu.cpp:10: error: expected `;’ before ‘pos’
Provacpiupiu.cpp:10: error: ‘pos’ was not declared in this scope

12 03 2008
andrea

invece se metto il typedef, come nel modo seguente:

#include
#include

using namespace std;

int main()
{
typedef set a;
a.insert(4);
for(a::iterator pos =a.begin; pos!=a.end; pos++)
{
cout<<“Il valore inserito e'”<< *pos<<endl;
}
return 0;
}

mi da quest’altri errori:

Provacpiupiu.cpp: In function ‘int main()’:
Provacpiupiu.cpp:9: error: expected unqualified-id before ‘.’ token
Provacpiupiu.cpp:10: error: expected primary-expression before ‘.’ token
Provacpiupiu.cpp:10: error: expected primary-expression before ‘.’ token

14 11 2009
Gaia

ho un problema: dopo aver digitato dalla shell la riga di comando “sudo aptitude install build-essential” mi chiede una password! dove la trovo? grazie!!

5 04 2010
monpracem

Grazie! 😉

9 11 2012
crate and barrel

It’s an awesome piece of writing for all the internet viewers; they will take advantage from it I am sure.

1 02 2013
amanda seyfried hot nude

My ally graduated against a best Amanda seyfried nudes as well as
college.




%d blogger hanno fatto clic su Mi Piace per questo: