OVH Cloud OVH Cloud

pb gcc: Référence indéfinie

8 réponses
Avatar
DenRay
Bonjour à tous,

Débutant en C++ sous linux (suse 8.2), je lance la commande:
" gcc -ototo test.cpp ".

Le fichier test.cpp contient:

#include <iostream>

int main()
{
printf "coucou\n";
return 0;
}


gcc affiche:
/tmp/ccZF5rVg.o(.text+0x46):
In function `__static_initialization_and_destruction_0':
/usr/include/g++/iostream:77:
référence indéfinie vers « std::ios_base::Init::Init[in-charge]()»
/tmp/ccZF5rVg.o(.text+0x75):
In function `__tcf_0':
/usr/include/g++/iostream:77:
référence indéfinie vers « std::ios_base::Init::~Init [in-charge]()»
/tmp/ccZF5rVg.o(.eh_frame+0x11):
In function `main':
/home/denray/Prog/CPP/Cours/test.cpp:21:
référence indéfinie vers « __gxx_personality_v0 »
collect2: ld returned 1 exit status

(note: si je met cout << "coucou" à la pace de printf
=> il ne connait pas cout)

dois-je paramétrer qqchose pour utiliser gcc ?
(gcc est la version 3.3.2)

Merci pour l'aide.

Denis

8 réponses

Avatar
Jean-Marc Bourguet
"DenRay" writes:

Débutant en C++ sous linux (suse 8.2), je lance la commande:
" gcc -ototo test.cpp ".


g++ pour compiler du C++. Ca devrait etre dans la FAQ de gcc, si ce
ne l'est pas deja.

Le fichier test.cpp contient:

#include <iostream>

int main()
{
printf "coucoun";


Es-tu sur que ca passe a la compilation. Il faut au moins des
parentheses autour de "coucoun".

Et en C++,

std::cout << "coucoun";

return 0;
}

(note: si je met cout << "coucou" à la pace de printf
=> il ne connait pas cout)


Depuis ca va faire bientot 5 ans (anniversaire ce mois si je ne me
trompe pas) que cout se trouve dans le namespace std. Autre
possibilites, mettre

using std::cout;

ou

using namespace std;

avant l'utilisation. De preference pas de maniere globale dans un
en-tete.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
un.gabacho.sans.pourrier
"DenRay" writes:

Bonjour à tous,

Débutant en C++ sous linux (suse 8.2), je lance la commande:
" gcc -ototo test.cpp ".


Chez moi gcc compile le c, et g++ compile le c++. Et manifestement
certaines de tes erreurs viennent de là.

Le fichier test.cpp contient:

#include <iostream>

int main()
{
printf "coucoun";


printf("coucoun");

return 0;
}


Les fonctions C ou C++ prennent leur argument entre ().

Ça n'est pas tout : avec un compilateur récent il faut mettre un

using spacename std;

au début. Ou bien appeler ton cout avec un truc comme std::cout ...

Ceci compile chez moi.

#include <iostream>
using namespace std;

int main()
{
cout << "lapinn" ;
printf("carotten"); // deconseille
return 0;
}

Avatar
Niamor
salut
et si tu mettais un .h derrière le iostream ...

Niamor


"DenRay" a écrit dans le message de
news:
Bonjour à tous,

Débutant en C++ sous linux (suse 8.2), je lance la commande:
" gcc -ototo test.cpp ".

Le fichier test.cpp contient:

#include <iostream>

int main()
{
printf "coucoun";
return 0;
}


gcc affiche:
/tmp/ccZF5rVg.o(.text+0x46):
In function `__static_initialization_and_destruction_0':
/usr/include/g++/iostream:77:
référence indéfinie vers « std::ios_base::Init::Init[in-charge]()»
/tmp/ccZF5rVg.o(.text+0x75):
In function `__tcf_0':
/usr/include/g++/iostream:77:
référence indéfinie vers « std::ios_base::Init::~Init [in-charge]()»
/tmp/ccZF5rVg.o(.eh_frame+0x11):
In function `main':
/home/denray/Prog/CPP/Cours/test.cpp:21:
référence indéfinie vers « __gxx_personality_v0 »
collect2: ld returned 1 exit status

(note: si je met cout << "coucou" à la pace de printf
=> il ne connait pas cout)

dois-je paramétrer qqchose pour utiliser gcc ?
(gcc est la version 3.3.2)

Merci pour l'aide.

Denis


Avatar
Fabien SK
Niamor wrote:
salut
et si tu mettais un .h derrière le iostream ...

Niamor


Lis le message de Jean-Marc Bourguet là-dessus

Avatar
Frédéric Mazué
Chez moi gcc compile le c, et g++ compile le c++.


Chez moi gcc est un frontal qui invoque le bon compilateur selon l'extension
du nom de fichier. Ainsi gcc "compile" c, cpp, java, fortran.

Et manifestement
certaines de tes erreurs viennent de là.


Manifestement pas.

Bien cordialement

Fred

Avatar
Jean-Marc Bourguet
"Frédéric Mazué" writes:

Chez moi gcc compile le c, et g++ compile le c++.


Chez moi gcc est un frontal qui invoque le bon compilateur selon l'extension
du nom de fichier. Ainsi gcc "compile" c, cpp, java, fortran.

Et manifestement
certaines de tes erreurs viennent de là.


Manifestement pas.


g++ lie avec la bibliotheque C++, gcc non. Ses problemes de link
proviennent vraissemblablement de la.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
un.gabacho.sans.pourrier
Jean-Marc Bourguet writes:

"Frédéric Mazué" writes:

Chez moi gcc compile le c, et g++ compile le c++.


Chez moi gcc est un frontal qui invoque le bon compilateur selon l'extension
du nom de fichier. Ainsi gcc "compile" c, cpp, java, fortran.

Et manifestement
certaines de tes erreurs viennent de là.


Manifestement pas.


g++ lie avec la bibliotheque C++, gcc non. Ses problemes de link
proviennent vraissemblablement de la.


Oui.

D'ailleurs il me semble que la version francisée de son gcc est pas
claire là-dessus. Chez moi si je compile avec gcc j'ai un message
d'erreur qui provient clairement de ld ... Enfin, ça aide pas
forcément à faire le diagnostic.



Avatar
DenRay

"DenRay" writes:

Bonjour à tous,

Débutant en C++ sous linux (suse 8.2), je lance la commande:
" gcc -ototo test.cpp ".


Chez moi gcc compile le c, et g++ compile le c++. Et manifestement
certaines de tes erreurs viennent de là.

Le fichier test.cpp contient:

#include <iostream>

int main()
{
printf "coucoun";


printf("coucoun");

return 0;
}


Les fonctions C ou C++ prennent leur argument entre ().

Ça n'est pas tout : avec un compilateur récent il faut mettre un

using spacename std;

au début. Ou bien appeler ton cout avec un truc comme std::cout ...

Ceci compile chez moi.

#include <iostream>
using namespace std;

int main()
{
cout << "lapinn" ;
printf("carotten"); // deconseille
return 0;
}



Merci pour l'aide.
Cela marche maintenant.

Il faut effectivement que je compile via g++ (et non gcc).

Les 2 prog suivants marchent:

prog 1 (test.cpp):
************************
#include <iostream>
using namespace std;

int main()
{
cout << "coucou" << endl;
return 0;
}

compilation:
------------
g++ test.cpp


prog 2 (test.cpp):
***********************
#include <iostream.h>

int main()
{
cout << "coucou" << endl;
return 0;
}

compilation:
------------
g++ test.cpp -Wno-deprecated


C'est OK
(mais pour l'instant je ne peux expliquer
la différence entre
- l'utilisation de iostream (sans .h) et g++ seul.
- l'utilisation de iostream.h et g++ -Wno-deprecated
j'approfondirai plus tard...)

Merci encore pour l'aide
(Les parentheses du printf sont un oubli dans le mail précédent, sorry ;)