Rechercher : dans
Par :

Compilation dans shell / dans commande unix

Dernière réponse le 28 oct 2008 à 17:19:53 jeanne38, le 27 oct 2008 à 11:30:46 
 Signaler ce message aux modérateurs

Bonjour,

Je suis en train de tester des options de compilations sous linux ix86 et j'ai un problème.

Dans un programme shell, je teste la compilation d'un programme C minimaliste :
-----------------------------------------------------------
TMP=test_$$
cat > $TMP.c << \EOF

#include <stdio.h>
int main ()
{
puts ("Hello Vasy");
return 0;
}
EOF

"$CC" $TMP.c -o $TMP > /dev/null 2>&1

CODE_ERREUR=$?

if [ $CODE_ERREUR -ne 0 ]
then
echo "Error code : $CODE_ERREUR"
echo "*** \`\`$CC'' failed to compile a minimal C program"
echo "==> Check that your C compiler is installed properly"
...............
-----------------------------------------------------------

Cette compilation echoue :
Error code : 127
*** ``/opt/sun/sunstudio12/bin/suncc -lgcc -L/usr/lib/gcc/i486-linux-gnu/4.1.2/'' failed to compile a minimal C program
==> Check that your C compiler is installed properly

Lorsque je compile le même programme minimaliste directement sous linux :
/opt/sun/sunstudio12/bin/suncc -lgcc -L/usr/lib/gcc/i486-linux-gnu/4.1.2/ /tmp/toto.c -o /tmp/toto

Ca compile nickel et l'execution du programme toto affiche :
Hello Vasy

Je suis perdue ... si vous pouviez m'aider !!
Merci !!

Jeanne

Configuration: Solaris
Firefox 2.0.0.15

Meilleures réponses pour « Compilation dans shell / dans commande unix » dans :
Commandes UNIX Voir Tableau des principales commandes UNIX Commande Unix Description Options ls liste le contenu d'un répertoire -a Affiche tous les fichiers, y compris les fichiers cachés ...
[Shell] Accès aux dernières commandes de l'historique VoirLe shell Linux/Unix regorge de fonctionnalités permettant de gagner du temps. Ainsi, il est possible de remonter dans l'historique des dernières commandes grâce aux flèches de navigation en appuyant sur la flèche du haut. Mais il y a moyen...
[Linux] Utiliser la commande 'su' VoirPréambule Se connecter sous un autre ID utilisateur avec "su" Démarrer un nouveau shell de connexion avec "su -" Revenir au shell précédent Suspendre le shell du compte root Notes Préambule La commande "su" (Switch User, appelée plus...
Exécuter un script shell VoirExécution d'un script Pour pouvoir exécuter un script ou un programme en ligne de commande il y a plusieurs possibilités : 1. Le chemin absolu 2. Le chemin relatif 3. Modifier la variable PATH Note: Le Sha-Bang Premièrement,...
Télécharger CygWin VoirCygwin est un environnement UNIX pour Windows composé: d'un shell Unix d'une librairie dynamique (DLL) chargée de fournir une couche d'émulation Unix pour le système Windows d'un ensemble de librairies, sources et exécutables adaptés à Cygwin...
Systèmes UNIX - Le shell VoirIntroduction au shell L'interpréteur de commandes est l'interface entre l'utilisateur et le système d'exploitation, d'où son nom anglais «shell», qui signifie «coquille». Le shell est ainsi chargé de faire l'intermédiaire entre le système...
UNIX - Les fichiers VoirIntroduction aux fichiers Unix Sous les systèmes UNIX tout élément est représenté sous forme de fichier. L'ensemble des fichiers est architecturé autour d'une unique arborescence dont la base, appelée racine, est notée «/». Types de...
Introduction aux systèmes UNIX VoirLe système UNIX Le système Unix est un système d'exploitation multi-utilisateurs, multi-tâches, ce qui signifie qu'il permet à un ordinateur mono ou multi-processeurs de faire exécuter simultanément plusieurs programmes par un ou plusieurs...

1

(Pabix), le 27 oct 2008 à 18:56:35

Il semblerait que ton $CC soit un répertoire et pas un programme.

Répondre à (Pabix)

2

dubcek, le 28 oct 2008 à 09:27:04

Hello
supprimer > /dev/null 2>&1
pour voir les messages
que content $CC ?

Répondre à dubcek

3

jeanne38, le 28 oct 2008 à 15:16:22

J'ai ajouté des traces d'execution :
************************************************************­************
CHECK_C_COMPILER () {
# compilation et execution d'un programme C minimal
TMP=test_$$
cat > /tmp/$TMP.c << \EOF

#include <stdio.h>
int main ()
{
puts ("Hello Vasy");
return 0;
}
EOF

echo "CC=$CC /tmp/$TMP.c -o /tmp/$TMP"
"$CC" /tmp/$TMP.c -o /tmp/$TMP > /dev/null 2>&1

CODE_ERREUR=$?

if [ $CODE_ERREUR -ne 0 ]
then
echo "Error code : $CODE_ERREUR"
...
************************************************************************

résultat sous linux :

CC=/opt/sun/sunstudio12/bin/suncc -lgcc -L/usr/lib/gcc/i486-linux-gnu/4.1.2/ /tmp/test_8116.c -o /tmp/test_8116
Error code : 127
*** ``/opt/sun/sunstudio12/bin/suncc -lgcc -L/usr/lib/gcc/i486-linux-gnu/4.1.2/'' failed to compile a minimal C program
==> Check that your C compiler is installed properly


Et quand je copie colle sous linux la ligne "CC=" :
> /opt/sun/sunstudio12/bin/suncc -lgcc -L/usr/lib/gcc/i486-linux-gnu/4.1.2/ /tmp/test_8116.c -o /tmp/test_8116

aucun message d'erreur ! la compilation s'est bien déroulée puisqu'ensuite je fais :

> /tmp/test_8116
Hello Vasy

Il m'affiche bien le résultat de mon petit programme C minimaliste.

Dans la ligne d'appel au compilteur suncc, il n'y a pas de variable qui serait propre à mon programme shell et inconnue en dehors, alors je ne vois pas où est la différence ...

Répondre à jeanne38

4

dubcek, le 28 oct 2008 à 15:23:50

Ces messages d'erreurs c'est toi qui les affiche
après ta compile en ligne que répond
echo $?

Répondre à dubcek

5

jeanne38, le 28 oct 2008 à 15:30:37

> /opt/sun/sunstudio12/bin/suncc -lgcc -L/usr/lib/gcc/i486-linux-gnu/4.1.2/ /tmp/test_8116.c -o /tmp/test_8116
> echo $?
0

J'ai fait afficher $? pour savoir quel était le code d'erreur, mais ça ne m'avance pas plus finalement ...

Répondre à jeanne38

6

dubcek, le 28 oct 2008 à 15:54:45

"$CC" /tmp/$TMP.c -o /tmp/$TMP > /dev/null 2>&1

CODE_ERREUR=$?

if [ $CODE_ERREUR -ne 0 ]
then
echo "Error code : $CODE_ERREUR" 


enlève tout sauf $CC /tmp/$TMP.c -o /tmp/$TMP

Répondre à dubcek

7

jeanne38, le 28 oct 2008 à 16:21:13

Bonjour,

j'ai mis tout ce que tu me disais en commentaires, en laissant la suite de l'execution "normale" :
(j'ai enlevé aussi la variable CODE_ERREUR)

**********************************************************************************************************
echo "CC=$CC /tmp/$TMP.c -o /tmp/$TMP"
# "$CC" $TMP.c -o $TMP > /dev/null 2>&1
"$CC" /tmp/$TMP.c -o /tmp/$TMP > /dev/null 2>&1

# if [ $? -ne 0 ]
# then
# echo "*** \`\`$CC'' failed to compile a minimal C program"
# echo "==> Check that your C compiler is installed properly"
# else
test "`./$TMP 2>/dev/null`" = "Hello Vasy"
RESULT=$?
if [ $RESULT -ne 0 ]
then
echo "*** A minimal C program compiled using \`\`$CC'' did not execute properly"
if [ \( "$ARCH" = "iX86" -o "$ARCH" = "x64" -o "$ARCH" = "ia64" \) -a "`basename "$CC"`" = "icc" ]
then
# cas du compilateur icc pour Linux pour lequel
# $LD_LIBRARY_PATH doit etre positionnee pour
# executer les binaires produits par icc avec
# edition dynamique de liens
echo "==> Set variable \`\`\$LD_LIBRARY_PATH'' to access the Intel CC runtime library"
echo " (e.g., `dirname $CC`/../lib)"
else
echo "==> Check that your C compiler is installed properly"
fi
fi
# fi
# rm -f $TMP.c $TMP $TMP.exe

Sans surprise, ça plante lors de : test "`./$TMP 2>/dev/null`" = "Hello Vasy"
Mêmes messages d'erreur, sauf que cette fois ce n'est pas à la compilation qu'il rale mais à l'execution (le programme n'existe pas, puisqu'il n'a pas pu être compilé)

CC=/opt/sun/sunstudio12/bin/suncc -lgcc -L/usr/lib/gcc/i486-linux-gnu/4.1.2/ /tmp/test_9401.c -o /tmp/test_9401
*** A minimal C program compiled using ``/opt/sun/sunstudio12/bin/suncc -lgcc -L/usr/lib/gcc/i486-linux-gnu/4.1.2/'' did not execute properly
==> Check that your C compiler is installed properly


Pfouuuu c'est déprimant ...

Répondre à jeanne38

8

dubcek, le 28 oct 2008 à 16:24:44

NNOONN
"$CC" /tmp/$TMP.c -o /tmp/$TMP enlève ça : > /dev/null 2>&1

Répondre à dubcek

9

jeanne38, le 28 oct 2008 à 16:30:23

Oups pardon ! :-)

ok je l'ai enlevé
je me retrouve avec uniquement : $CC /tmp/$TMP.c -o $TMP
et ça marche !!

Merci dubcek pour ton aide précieuse !! :-)))

Répondre à jeanne38

10

dubcek, le 28 oct 2008 à 16:32:42

Bizarre parce ce sont juste des redirections !! tu as enlevé les guillemets autour de $CC ?

Répondre à dubcek

11

jeanne38, le 28 oct 2008 à 16:54:15

Oui j'ai noté :
$CC /tmp/$TMP.c -o $TMP

J'ai enlevé les " " autour de $CC : lorsque je les remets "$CC" ça merdoit à nouveau ...

Tu penses que ce n'est pas bon comme ça ?

Répondre à jeanne38

12

 dubcek, le 28 oct 2008 à 17:19:53

Si si mais je ne pense pas que ce soit le fait d'enlever les redirections qui a résolu le problème, donc peut-être les "

Répondre à dubcek