Bonjour,
Je suis peut être un peu hors charte, mais ce forum est celui de
l'arborescence fr qui m'a semblé le plus adapté.
Soit le programme suivant, hello.c :
#include <ncurses.h>
int main()
{
initscr(); /* Start curses mode */
printw("Hello World !!!"); /* Print Hello World */
refresh(); /* Print it on to the real screen */
getch(); /* Wait for user input */
endwin(); /* End curses mode */
return 0;
}
Les commandes de compilation suivantes fonctionnent correctement :
gcc -o hello hello.c -lncurses
gcc -lncurses -o hello hello.c
gcc -static -o hello hello.c -lncurses
sur un debian 4r1 et avec un gcc 4.1.2
Par contre
gcc -static -lncurses -o hello hello.c
me produit une bordée d'erreurs :
/tmp/ccWYtzcj.o: dans la fonction « main »:
hello.c:(.text+0x12): référence indéfinie vers « initscr »
hello.c:(.text+0x1e): référence indéfinie vers « printw »
....
(Je n'ai pas tout recopié)
En soit, ça n'est pas gênant, mais j'aimerais comprendre pourquoi la
position de -lncurses provoque ce comportement et ce uniquement pour la
compilation statique.
Cordialement
Bonjour,
Je suis peut être un peu hors charte, mais ce forum est celui de
l'arborescence fr qui m'a semblé le plus adapté.
Soit le programme suivant, hello.c :
#include <ncurses.h>
int main()
{
initscr(); /* Start curses mode */
printw("Hello World !!!"); /* Print Hello World */
refresh(); /* Print it on to the real screen */
getch(); /* Wait for user input */
endwin(); /* End curses mode */
return 0;
}
Les commandes de compilation suivantes fonctionnent correctement :
gcc -o hello hello.c -lncurses
gcc -lncurses -o hello hello.c
gcc -static -o hello hello.c -lncurses
sur un debian 4r1 et avec un gcc 4.1.2
Par contre
gcc -static -lncurses -o hello hello.c
me produit une bordée d'erreurs :
/tmp/ccWYtzcj.o: dans la fonction « main »:
hello.c:(.text+0x12): référence indéfinie vers « initscr »
hello.c:(.text+0x1e): référence indéfinie vers « printw »
....
(Je n'ai pas tout recopié)
En soit, ça n'est pas gênant, mais j'aimerais comprendre pourquoi la
position de -lncurses provoque ce comportement et ce uniquement pour la
compilation statique.
Cordialement
Bonjour,
Je suis peut être un peu hors charte, mais ce forum est celui de
l'arborescence fr qui m'a semblé le plus adapté.
Soit le programme suivant, hello.c :
#include <ncurses.h>
int main()
{
initscr(); /* Start curses mode */
printw("Hello World !!!"); /* Print Hello World */
refresh(); /* Print it on to the real screen */
getch(); /* Wait for user input */
endwin(); /* End curses mode */
return 0;
}
Les commandes de compilation suivantes fonctionnent correctement :
gcc -o hello hello.c -lncurses
gcc -lncurses -o hello hello.c
gcc -static -o hello hello.c -lncurses
sur un debian 4r1 et avec un gcc 4.1.2
Par contre
gcc -static -lncurses -o hello hello.c
me produit une bordée d'erreurs :
/tmp/ccWYtzcj.o: dans la fonction « main »:
hello.c:(.text+0x12): référence indéfinie vers « initscr »
hello.c:(.text+0x1e): référence indéfinie vers « printw »
....
(Je n'ai pas tout recopié)
En soit, ça n'est pas gênant, mais j'aimerais comprendre pourquoi la
position de -lncurses provoque ce comportement et ce uniquement pour la
compilation statique.
Cordialement
GCC résoud les symboles dans l'ordre ou ils sont requis et dans l'ordre
ou ils sont fournis, c'est à dire qu'un symbole manquant dans une
librairie sera recherché dans les librairies qui le suivent mais pas
celles qui le précèdent. Du coup, les symboles manquants dans "hello" ne
sont pas cherchés dans "libncurses" car le flag -l est donné avant.
L'ordre des librairies a lui aussi une importance si les librairies ont
des interdépendances.
GCC résoud les symboles dans l'ordre ou ils sont requis et dans l'ordre
ou ils sont fournis, c'est à dire qu'un symbole manquant dans une
librairie sera recherché dans les librairies qui le suivent mais pas
celles qui le précèdent. Du coup, les symboles manquants dans "hello" ne
sont pas cherchés dans "libncurses" car le flag -l est donné avant.
L'ordre des librairies a lui aussi une importance si les librairies ont
des interdépendances.
GCC résoud les symboles dans l'ordre ou ils sont requis et dans l'ordre
ou ils sont fournis, c'est à dire qu'un symbole manquant dans une
librairie sera recherché dans les librairies qui le suivent mais pas
celles qui le précèdent. Du coup, les symboles manquants dans "hello" ne
sont pas cherchés dans "libncurses" car le flag -l est donné avant.
L'ordre des librairies a lui aussi une importance si les librairies ont
des interdépendances.
Yann Renard wrote:GCC résoud les symboles dans l'ordre ou ils sont requis et dans l'ordre
ou ils sont fournis, c'est à dire qu'un symbole manquant dans une
librairie sera recherché dans les librairies qui le suivent mais pas
celles qui le précèdent. Du coup, les symboles manquants dans "hello" ne
sont pas cherchés dans "libncurses" car le flag -l est donné avant.
L'ordre des librairies a lui aussi une importance si les librairies ont
des interdépendances.
Admettons (je suis d'accord avec "l'ordre fournis" mais je doute
pour "l'ordre requis") : cela explique que la compilation statique echoue.
Mais cela amène une autre question : pourquoi l'édition réussit-elle en
compilation dynamique (2ième commande).
parce que le liage dynamique est plus simple, il se contente de voir si
Yann Renard wrote:
GCC résoud les symboles dans l'ordre ou ils sont requis et dans l'ordre
ou ils sont fournis, c'est à dire qu'un symbole manquant dans une
librairie sera recherché dans les librairies qui le suivent mais pas
celles qui le précèdent. Du coup, les symboles manquants dans "hello" ne
sont pas cherchés dans "libncurses" car le flag -l est donné avant.
L'ordre des librairies a lui aussi une importance si les librairies ont
des interdépendances.
Admettons (je suis d'accord avec "l'ordre fournis" mais je doute
pour "l'ordre requis") : cela explique que la compilation statique echoue.
Mais cela amène une autre question : pourquoi l'édition réussit-elle en
compilation dynamique (2ième commande).
parce que le liage dynamique est plus simple, il se contente de voir si
Yann Renard wrote:GCC résoud les symboles dans l'ordre ou ils sont requis et dans l'ordre
ou ils sont fournis, c'est à dire qu'un symbole manquant dans une
librairie sera recherché dans les librairies qui le suivent mais pas
celles qui le précèdent. Du coup, les symboles manquants dans "hello" ne
sont pas cherchés dans "libncurses" car le flag -l est donné avant.
L'ordre des librairies a lui aussi une importance si les librairies ont
des interdépendances.
Admettons (je suis d'accord avec "l'ordre fournis" mais je doute
pour "l'ordre requis") : cela explique que la compilation statique echoue.
Mais cela amène une autre question : pourquoi l'édition réussit-elle en
compilation dynamique (2ième commande).
parce que le liage dynamique est plus simple, il se contente de voir si
Yann Renard wrote:GCC résoud les symboles dans l'ordre ou ils sont requis et dans
l'ordre ou ils sont fournis, c'est à dire qu'un symbole manquant
dans une librairie sera recherché dans les librairies qui le suivent
mais pas celles qui le précèdent.
cela explique que la compilation statique echoue.
Mais cela amène une autre question : pourquoi l'édition réussit-elle
en compilation dynamique
Yann Renard wrote:
GCC résoud les symboles dans l'ordre ou ils sont requis et dans
l'ordre ou ils sont fournis, c'est à dire qu'un symbole manquant
dans une librairie sera recherché dans les librairies qui le suivent
mais pas celles qui le précèdent.
cela explique que la compilation statique echoue.
Mais cela amène une autre question : pourquoi l'édition réussit-elle
en compilation dynamique
Yann Renard wrote:GCC résoud les symboles dans l'ordre ou ils sont requis et dans
l'ordre ou ils sont fournis, c'est à dire qu'un symbole manquant
dans une librairie sera recherché dans les librairies qui le suivent
mais pas celles qui le précèdent.
cela explique que la compilation statique echoue.
Mais cela amène une autre question : pourquoi l'édition réussit-elle
en compilation dynamique
Autrement dit, à la compilation il n'y a pas de vraie vérification que le
symbole existe réellement dans la bibliothèque (partagée).
Entre autre
raisons, parce que la bibliothèque réellement chargée est peut-être
indisponible (imagine le cas où il y a des dépendances circulaires).
L'ordre pour l'édition statique est en fait un truc de développement (qui
permet d'interposer une bibliothèque avant les bibliothèques normales ;
exemple typique, une bibliothèque avec une version de malloc() qui
s'épanche verbeusement sur l'allocation dynamique de ton programme).
Autrement dit, à la compilation il n'y a pas de vraie vérification que le
symbole existe réellement dans la bibliothèque (partagée).
Entre autre
raisons, parce que la bibliothèque réellement chargée est peut-être
indisponible (imagine le cas où il y a des dépendances circulaires).
L'ordre pour l'édition statique est en fait un truc de développement (qui
permet d'interposer une bibliothèque avant les bibliothèques normales ;
exemple typique, une bibliothèque avec une version de malloc() qui
s'épanche verbeusement sur l'allocation dynamique de ton programme).
Autrement dit, à la compilation il n'y a pas de vraie vérification que le
symbole existe réellement dans la bibliothèque (partagée).
Entre autre
raisons, parce que la bibliothèque réellement chargée est peut-être
indisponible (imagine le cas où il y a des dépendances circulaires).
L'ordre pour l'édition statique est en fait un truc de développement (qui
permet d'interposer une bibliothèque avant les bibliothèques normales ;
exemple typique, une bibliothèque avec une version de malloc() qui
s'épanche verbeusement sur l'allocation dynamique de ton programme).
Antoine Leca wrote:Autrement dit, à la compilation il n'y a pas de vraie vérification
que le symbole existe réellement dans la bibliothèque (partagée).
Hum..... J'ai un doute
Si je compile un programme avec un appel à la fonction truc(), ni
déclarée ni définie, le compilateur me retourne un message d'erreur.
Il vérifie donc l'existence du symbole.
Entre autre
raisons, parce que la bibliothèque réellement chargée est peut-être
indisponible (imagine le cas où il y a des dépendances circulaires).
Dans ce cas c'est à l'exécution que ce produira l'erreur.
Et il me semble que cela ne peut se produire que si les libxx.so de
développement sont différentes des libxx.so d'exécution.
C'est possible si le binaire est portée d'une machine à une autre,
mais peu probable pour une même machine.
L'ordre pour l'édition statique est en fait un truc de développement
(qui permet d'interposer une bibliothèque avant les bibliothèques
normales ; exemple typique, une bibliothèque avec une version de
malloc() qui s'épanche verbeusement sur l'allocation dynamique de
ton programme).
C'est aussi le cas en compilation dynamique : c'est la première
occurence du symbole dans l'ordre d'examen des bibliothèques qui est
choisi.
Je reste dubitatif quant aux causes exactes de cette "erreur" de
compilation.
Antoine Leca wrote:
Autrement dit, à la compilation il n'y a pas de vraie vérification
que le symbole existe réellement dans la bibliothèque (partagée).
Hum..... J'ai un doute
Si je compile un programme avec un appel à la fonction truc(), ni
déclarée ni définie, le compilateur me retourne un message d'erreur.
Il vérifie donc l'existence du symbole.
Entre autre
raisons, parce que la bibliothèque réellement chargée est peut-être
indisponible (imagine le cas où il y a des dépendances circulaires).
Dans ce cas c'est à l'exécution que ce produira l'erreur.
Et il me semble que cela ne peut se produire que si les libxx.so de
développement sont différentes des libxx.so d'exécution.
C'est possible si le binaire est portée d'une machine à une autre,
mais peu probable pour une même machine.
L'ordre pour l'édition statique est en fait un truc de développement
(qui permet d'interposer une bibliothèque avant les bibliothèques
normales ; exemple typique, une bibliothèque avec une version de
malloc() qui s'épanche verbeusement sur l'allocation dynamique de
ton programme).
C'est aussi le cas en compilation dynamique : c'est la première
occurence du symbole dans l'ordre d'examen des bibliothèques qui est
choisi.
Je reste dubitatif quant aux causes exactes de cette "erreur" de
compilation.
Antoine Leca wrote:Autrement dit, à la compilation il n'y a pas de vraie vérification
que le symbole existe réellement dans la bibliothèque (partagée).
Hum..... J'ai un doute
Si je compile un programme avec un appel à la fonction truc(), ni
déclarée ni définie, le compilateur me retourne un message d'erreur.
Il vérifie donc l'existence du symbole.
Entre autre
raisons, parce que la bibliothèque réellement chargée est peut-être
indisponible (imagine le cas où il y a des dépendances circulaires).
Dans ce cas c'est à l'exécution que ce produira l'erreur.
Et il me semble que cela ne peut se produire que si les libxx.so de
développement sont différentes des libxx.so d'exécution.
C'est possible si le binaire est portée d'une machine à une autre,
mais peu probable pour une même machine.
L'ordre pour l'édition statique est en fait un truc de développement
(qui permet d'interposer une bibliothèque avant les bibliothèques
normales ; exemple typique, une bibliothèque avec une version de
malloc() qui s'épanche verbeusement sur l'allocation dynamique de
ton programme).
C'est aussi le cas en compilation dynamique : c'est la première
occurence du symbole dans l'ordre d'examen des bibliothèques qui est
choisi.
Je reste dubitatif quant aux causes exactes de cette "erreur" de
compilation.
Si je compile un programme avec un appel à la fonction truc(), ni déclarée
ni définie, le compilateur me retourne un message d'erreur. Il vérifie donc
l'existence du symbole.
Si je compile un programme avec un appel à la fonction truc(), ni déclarée
ni définie, le compilateur me retourne un message d'erreur. Il vérifie donc
l'existence du symbole.
Si je compile un programme avec un appel à la fonction truc(), ni déclarée
ni définie, le compilateur me retourne un message d'erreur. Il vérifie donc
l'existence du symbole.
Non, c'est l'éditeur de lien qui ne pourra résoudre le symbole s'il
n'est pas dans une bibliothèque qu'il connait (par défaut).
.....
le compilateur s'est royalement contrefiché de la résolution de truc()
c'est normal
Non, c'est l'éditeur de lien qui ne pourra résoudre le symbole s'il
n'est pas dans une bibliothèque qu'il connait (par défaut).
.....
le compilateur s'est royalement contrefiché de la résolution de truc()
c'est normal
Non, c'est l'éditeur de lien qui ne pourra résoudre le symbole s'il
n'est pas dans une bibliothèque qu'il connait (par défaut).
.....
le compilateur s'est royalement contrefiché de la résolution de truc()
c'est normal
Thierry PINELLI wrote:Non, c'est l'éditeur de lien qui ne pourra résoudre le symbole s'il
n'est pas dans une bibliothèque qu'il connait (par défaut).
.....le compilateur s'est royalement contrefiché de la résolution de
truc()
c'est normal
J'ai effectivement fait un abus de langage en
assimilant "compilation+edition de liens" à "compilation".
Je différenciais, mal, en fait "compilation+edition statique"
de "compilation+edition dynamique".
Malgré les diverses explications qui m'ont été données, j'ai encore
du mal à avoir une vue synthétique de tout cela (en particulier s'il
y a des appels croisés entre bibliothèques). Il faut que je fasse
quelques essais simples dans mon coin pour mieux appréhender tout
cela.
Il faut déjà que j'apprenne à fabriquer des bibliothèques dynamiques.
Thierry PINELLI wrote:
Non, c'est l'éditeur de lien qui ne pourra résoudre le symbole s'il
n'est pas dans une bibliothèque qu'il connait (par défaut).
.....
le compilateur s'est royalement contrefiché de la résolution de
truc()
c'est normal
J'ai effectivement fait un abus de langage en
assimilant "compilation+edition de liens" à "compilation".
Je différenciais, mal, en fait "compilation+edition statique"
de "compilation+edition dynamique".
Malgré les diverses explications qui m'ont été données, j'ai encore
du mal à avoir une vue synthétique de tout cela (en particulier s'il
y a des appels croisés entre bibliothèques). Il faut que je fasse
quelques essais simples dans mon coin pour mieux appréhender tout
cela.
Il faut déjà que j'apprenne à fabriquer des bibliothèques dynamiques.
Thierry PINELLI wrote:Non, c'est l'éditeur de lien qui ne pourra résoudre le symbole s'il
n'est pas dans une bibliothèque qu'il connait (par défaut).
.....le compilateur s'est royalement contrefiché de la résolution de
truc()
c'est normal
J'ai effectivement fait un abus de langage en
assimilant "compilation+edition de liens" à "compilation".
Je différenciais, mal, en fait "compilation+edition statique"
de "compilation+edition dynamique".
Malgré les diverses explications qui m'ont été données, j'ai encore
du mal à avoir une vue synthétique de tout cela (en particulier s'il
y a des appels croisés entre bibliothèques). Il faut que je fasse
quelques essais simples dans mon coin pour mieux appréhender tout
cela.
Il faut déjà que j'apprenne à fabriquer des bibliothèques dynamiques.
J'ai effectivement fait un abus de langage en
assimilant "compilation+edition de liens" à "compilation".
J'ai effectivement fait un abus de langage en
assimilant "compilation+edition de liens" à "compilation".
J'ai effectivement fait un abus de langage en
assimilant "compilation+edition de liens" à "compilation".