j'ai une petite question sur la compilation:
J'ai un fichier .H où sont déclarées 3 fonctions A, B et C, et
le .CPP où se trouvent leurs implémentations.
J'ajoute le .CPP au projet, et dans le code du projet je
n'utilise pas la fonction C.
Quel est le comportement du compilateur: est-ce que la fonction
C est quand même incluse dans l'EXE?
Je me pose la question car avec mon compilo (Borland 6) quand
je suis en mode debug je ne peux pas ajouter de points d'arrets
sur le code des fonctions ou classes que je n'utilise pas.
Et enfin (plus spécifique Windows), est-ce le même principe
pour les DLLs? (Mais pourquoi ne serait-ce pas le cas?)
j'ai une petite question sur la compilation:
J'ai un fichier .H où sont déclarées 3 fonctions A, B et C, et
le .CPP où se trouvent leurs implémentations.
J'ajoute le .CPP au projet, et dans le code du projet je
n'utilise pas la fonction C.
Quel est le comportement du compilateur: est-ce que la fonction
C est quand même incluse dans l'EXE?
Je me pose la question car avec mon compilo (Borland 6) quand
je suis en mode debug je ne peux pas ajouter de points d'arrets
sur le code des fonctions ou classes que je n'utilise pas.
Et enfin (plus spécifique Windows), est-ce le même principe
pour les DLLs? (Mais pourquoi ne serait-ce pas le cas?)
j'ai une petite question sur la compilation:
J'ai un fichier .H où sont déclarées 3 fonctions A, B et C, et
le .CPP où se trouvent leurs implémentations.
J'ajoute le .CPP au projet, et dans le code du projet je
n'utilise pas la fonction C.
Quel est le comportement du compilateur: est-ce que la fonction
C est quand même incluse dans l'EXE?
Je me pose la question car avec mon compilo (Borland 6) quand
je suis en mode debug je ne peux pas ajouter de points d'arrets
sur le code des fonctions ou classes que je n'utilise pas.
Et enfin (plus spécifique Windows), est-ce le même principe
pour les DLLs? (Mais pourquoi ne serait-ce pas le cas?)
Bonjour à tous,
j'ai une petite question sur la compilation:
J'ai un fichier .H où sont déclarées 3 fonctions A, B et C, et le .CPP où
se trouvent leurs implémentations.
J'ajoute le .CPP au projet, et dans le code du projet je n'utilise pas la
fonction C.
Quel est le comportement du compilateur: est-ce que la fonction C est quand
même incluse dans l'EXE?
Mon opinion, sans certitude absolue : la norme ne connait par de
Je me pose la question car avec mon compilo (Borland 6) quand je suis en
mode debug je ne peux pas ajouter de points d'arrets sur le code des
fonctions ou classes que je n'utilise pas.
J'en suis très étonné.
Et enfin (plus spécifique Windows), est-ce le même principe pour les DLLs?
(Mais pourquoi ne serait-ce pas le cas?)
Le compilateur ne sait pas plus ce qu'est une DLL que ce qu'est un
Bonjour à tous,
j'ai une petite question sur la compilation:
J'ai un fichier .H où sont déclarées 3 fonctions A, B et C, et le .CPP où
se trouvent leurs implémentations.
J'ajoute le .CPP au projet, et dans le code du projet je n'utilise pas la
fonction C.
Quel est le comportement du compilateur: est-ce que la fonction C est quand
même incluse dans l'EXE?
Mon opinion, sans certitude absolue : la norme ne connait par de
Je me pose la question car avec mon compilo (Borland 6) quand je suis en
mode debug je ne peux pas ajouter de points d'arrets sur le code des
fonctions ou classes que je n'utilise pas.
J'en suis très étonné.
Et enfin (plus spécifique Windows), est-ce le même principe pour les DLLs?
(Mais pourquoi ne serait-ce pas le cas?)
Le compilateur ne sait pas plus ce qu'est une DLL que ce qu'est un
Bonjour à tous,
j'ai une petite question sur la compilation:
J'ai un fichier .H où sont déclarées 3 fonctions A, B et C, et le .CPP où
se trouvent leurs implémentations.
J'ajoute le .CPP au projet, et dans le code du projet je n'utilise pas la
fonction C.
Quel est le comportement du compilateur: est-ce que la fonction C est quand
même incluse dans l'EXE?
Mon opinion, sans certitude absolue : la norme ne connait par de
Je me pose la question car avec mon compilo (Borland 6) quand je suis en
mode debug je ne peux pas ajouter de points d'arrets sur le code des
fonctions ou classes que je n'utilise pas.
J'en suis très étonné.
Et enfin (plus spécifique Windows), est-ce le même principe pour les DLLs?
(Mais pourquoi ne serait-ce pas le cas?)
Le compilateur ne sait pas plus ce qu'est une DLL que ce qu'est un
Bonjour à tous,
j'ai une petite question sur la compilation:
J'ai un fichier .H où sont déclarées 3 fonctions A, B et C, et le
.CPP où se trouvent leurs implémentations.
J'ajoute le .CPP au projet, et dans le code du projet je n'utilise
pas la fonction C.
Quel est le comportement du compilateur: est-ce que la fonction C est
quand même incluse dans l'EXE?
Je me pose la question car avec mon compilo (Borland 6) quand je suis
en mode debug je ne peux pas ajouter de points d'arrets sur le code
des fonctions ou classes que je n'utilise pas.
Je dirais qu'il est possible qu'en mode debug, l'éditeur de liens soit
Et enfin (plus spécifique Windows), est-ce le même principe pour les
DLLs? (Mais pourquoi ne serait-ce pas le cas?)
C'est le même principe, sauf que les fonctions exportées ne sont évidemment
Bonjour à tous,
j'ai une petite question sur la compilation:
J'ai un fichier .H où sont déclarées 3 fonctions A, B et C, et le
.CPP où se trouvent leurs implémentations.
J'ajoute le .CPP au projet, et dans le code du projet je n'utilise
pas la fonction C.
Quel est le comportement du compilateur: est-ce que la fonction C est
quand même incluse dans l'EXE?
Je me pose la question car avec mon compilo (Borland 6) quand je suis
en mode debug je ne peux pas ajouter de points d'arrets sur le code
des fonctions ou classes que je n'utilise pas.
Je dirais qu'il est possible qu'en mode debug, l'éditeur de liens soit
Et enfin (plus spécifique Windows), est-ce le même principe pour les
DLLs? (Mais pourquoi ne serait-ce pas le cas?)
C'est le même principe, sauf que les fonctions exportées ne sont évidemment
Bonjour à tous,
j'ai une petite question sur la compilation:
J'ai un fichier .H où sont déclarées 3 fonctions A, B et C, et le
.CPP où se trouvent leurs implémentations.
J'ajoute le .CPP au projet, et dans le code du projet je n'utilise
pas la fonction C.
Quel est le comportement du compilateur: est-ce que la fonction C est
quand même incluse dans l'EXE?
Je me pose la question car avec mon compilo (Borland 6) quand je suis
en mode debug je ne peux pas ajouter de points d'arrets sur le code
des fonctions ou classes que je n'utilise pas.
Je dirais qu'il est possible qu'en mode debug, l'éditeur de liens soit
Et enfin (plus spécifique Windows), est-ce le même principe pour les
DLLs? (Mais pourquoi ne serait-ce pas le cas?)
C'est le même principe, sauf que les fonctions exportées ne sont évidemment
"Michaël Delva" typa:j'ai une petite question sur la compilation:
J'ai un fichier .H où sont déclarées 3 fonctions A, B et C, et le
.CPP où se trouvent leurs implémentations.
J'ajoute le .CPP au projet, et dans le code du projet je n'utilise
pas la fonction C.
Quel est le comportement du compilateur: est-ce que la fonction C est
quand même incluse dans l'EXE?
Mon opinion, sans certitude absolue : la norme ne connait par de
compilateur (ni même d'exe), mais une "translation" (code source ->
comportement).
La réalité n'est pas la norme. Dans les environnements courants que je
connais (le même que le votre, en particulier, mais en fait ce que
j'écris est très général), ce n'est pas le compilateur qui fabrique
l'exe.
Le compilateur effectue la "translation", et à ma connaissance il
traduit toutes les fonctions. Peut-être y a-t-il des execptions
(static ?), mais dans votre cas il génèrera du code objet pour la
fonction C. Le compilateur ignore la cible, le travail futur du lieur.
Il est d'ailleurs logique qu'il fabrique toutes les fonctions,
puisqu'à l'inverse il n'a pas besoin d'avoir le code (source ou objet)
de toutes les fonctions appelées. Je pense que le compilateur génère
entre autres choses, pour chaque fonction, le code machine à la
relocation près et la liste des fonctions appelables.
Le lieur fabrique une cible. Dans le cas que vous proposez, la cible
^^^^^
est un simple exécutable, qui exige un main(), il n'y a aucune raison
qu'il incorpore le code de la fonctiuon C. (Je suppose que) Le lieur
part du main() et de sa liste de fonctions pour bâtir de proche en
proche une liste globale de fonctions nécessaires.
Renommez main() en pied(). Le compilateur s'en moque, c'est le lieur
qui va se plaindre parce que la cible exige un main(). En revanche,
s'il y a un main() à compiler, le compilateur connait bien entendu les
règles qui s'y appliquent.
Je me pose la question car avec mon compilo (Borland 6) quand je suis
en mode debug je ne peux pas ajouter de points d'arrets sur le code
des fonctions ou classes que je n'utilise pas.
J'en suis très étonné.
Et enfin (plus spécifique Windows), est-ce le même principe pour les
DLLs? (Mais pourquoi ne serait-ce pas le cas?)
Le compilateur ne sait pas plus ce qu'est une DLL que ce qu'est un
exécutable. Il n'y a pas de différence avec le cas précédent, il va
compiler des fonctions. La cible du lieur sera une DLL, il aura donc
besoin de générer (donc de trouver dans le code objet) les fonctions
DllMain(), DllEntryPoint(), et les fonctions déclarées exportées de la
DLL. Ne seront dans le fichier .dll que ces fonctions et celles qui
leur sont nécessaires, comme dans le cas précédent. Si vos fonctions
A, B et C sont dans votre idée les fonctions exportables de la DLL, la
question n'a pas de sens. Elles seront toutes trois "dans la DLL".
Elles seront ensuite appelées à la demande, soit de façon explicite
(le programme récupère un pointeur sur chaque fonction exportée qu'il
souhaite utiliser, après avoir chargé la DLL), soit de façon
implicite, en laissant Windows se démerder, en gros, comme on utilise
les fonctions API, avec un .h, un .lib, et un .dll.
"Michaël Delva" <michael_delva@i_cant_remember.com> typa:
j'ai une petite question sur la compilation:
J'ai un fichier .H où sont déclarées 3 fonctions A, B et C, et le
.CPP où se trouvent leurs implémentations.
J'ajoute le .CPP au projet, et dans le code du projet je n'utilise
pas la fonction C.
Quel est le comportement du compilateur: est-ce que la fonction C est
quand même incluse dans l'EXE?
Mon opinion, sans certitude absolue : la norme ne connait par de
compilateur (ni même d'exe), mais une "translation" (code source ->
comportement).
La réalité n'est pas la norme. Dans les environnements courants que je
connais (le même que le votre, en particulier, mais en fait ce que
j'écris est très général), ce n'est pas le compilateur qui fabrique
l'exe.
Le compilateur effectue la "translation", et à ma connaissance il
traduit toutes les fonctions. Peut-être y a-t-il des execptions
(static ?), mais dans votre cas il génèrera du code objet pour la
fonction C. Le compilateur ignore la cible, le travail futur du lieur.
Il est d'ailleurs logique qu'il fabrique toutes les fonctions,
puisqu'à l'inverse il n'a pas besoin d'avoir le code (source ou objet)
de toutes les fonctions appelées. Je pense que le compilateur génère
entre autres choses, pour chaque fonction, le code machine à la
relocation près et la liste des fonctions appelables.
Le lieur fabrique une cible. Dans le cas que vous proposez, la cible
^^^^^
est un simple exécutable, qui exige un main(), il n'y a aucune raison
qu'il incorpore le code de la fonctiuon C. (Je suppose que) Le lieur
part du main() et de sa liste de fonctions pour bâtir de proche en
proche une liste globale de fonctions nécessaires.
Renommez main() en pied(). Le compilateur s'en moque, c'est le lieur
qui va se plaindre parce que la cible exige un main(). En revanche,
s'il y a un main() à compiler, le compilateur connait bien entendu les
règles qui s'y appliquent.
Je me pose la question car avec mon compilo (Borland 6) quand je suis
en mode debug je ne peux pas ajouter de points d'arrets sur le code
des fonctions ou classes que je n'utilise pas.
J'en suis très étonné.
Et enfin (plus spécifique Windows), est-ce le même principe pour les
DLLs? (Mais pourquoi ne serait-ce pas le cas?)
Le compilateur ne sait pas plus ce qu'est une DLL que ce qu'est un
exécutable. Il n'y a pas de différence avec le cas précédent, il va
compiler des fonctions. La cible du lieur sera une DLL, il aura donc
besoin de générer (donc de trouver dans le code objet) les fonctions
DllMain(), DllEntryPoint(), et les fonctions déclarées exportées de la
DLL. Ne seront dans le fichier .dll que ces fonctions et celles qui
leur sont nécessaires, comme dans le cas précédent. Si vos fonctions
A, B et C sont dans votre idée les fonctions exportables de la DLL, la
question n'a pas de sens. Elles seront toutes trois "dans la DLL".
Elles seront ensuite appelées à la demande, soit de façon explicite
(le programme récupère un pointeur sur chaque fonction exportée qu'il
souhaite utiliser, après avoir chargé la DLL), soit de façon
implicite, en laissant Windows se démerder, en gros, comme on utilise
les fonctions API, avec un .h, un .lib, et un .dll.
"Michaël Delva" typa:j'ai une petite question sur la compilation:
J'ai un fichier .H où sont déclarées 3 fonctions A, B et C, et le
.CPP où se trouvent leurs implémentations.
J'ajoute le .CPP au projet, et dans le code du projet je n'utilise
pas la fonction C.
Quel est le comportement du compilateur: est-ce que la fonction C est
quand même incluse dans l'EXE?
Mon opinion, sans certitude absolue : la norme ne connait par de
compilateur (ni même d'exe), mais une "translation" (code source ->
comportement).
La réalité n'est pas la norme. Dans les environnements courants que je
connais (le même que le votre, en particulier, mais en fait ce que
j'écris est très général), ce n'est pas le compilateur qui fabrique
l'exe.
Le compilateur effectue la "translation", et à ma connaissance il
traduit toutes les fonctions. Peut-être y a-t-il des execptions
(static ?), mais dans votre cas il génèrera du code objet pour la
fonction C. Le compilateur ignore la cible, le travail futur du lieur.
Il est d'ailleurs logique qu'il fabrique toutes les fonctions,
puisqu'à l'inverse il n'a pas besoin d'avoir le code (source ou objet)
de toutes les fonctions appelées. Je pense que le compilateur génère
entre autres choses, pour chaque fonction, le code machine à la
relocation près et la liste des fonctions appelables.
Le lieur fabrique une cible. Dans le cas que vous proposez, la cible
^^^^^
est un simple exécutable, qui exige un main(), il n'y a aucune raison
qu'il incorpore le code de la fonctiuon C. (Je suppose que) Le lieur
part du main() et de sa liste de fonctions pour bâtir de proche en
proche une liste globale de fonctions nécessaires.
Renommez main() en pied(). Le compilateur s'en moque, c'est le lieur
qui va se plaindre parce que la cible exige un main(). En revanche,
s'il y a un main() à compiler, le compilateur connait bien entendu les
règles qui s'y appliquent.
Je me pose la question car avec mon compilo (Borland 6) quand je suis
en mode debug je ne peux pas ajouter de points d'arrets sur le code
des fonctions ou classes que je n'utilise pas.
J'en suis très étonné.
Et enfin (plus spécifique Windows), est-ce le même principe pour les
DLLs? (Mais pourquoi ne serait-ce pas le cas?)
Le compilateur ne sait pas plus ce qu'est une DLL que ce qu'est un
exécutable. Il n'y a pas de différence avec le cas précédent, il va
compiler des fonctions. La cible du lieur sera une DLL, il aura donc
besoin de générer (donc de trouver dans le code objet) les fonctions
DllMain(), DllEntryPoint(), et les fonctions déclarées exportées de la
DLL. Ne seront dans le fichier .dll que ces fonctions et celles qui
leur sont nécessaires, comme dans le cas précédent. Si vos fonctions
A, B et C sont dans votre idée les fonctions exportables de la DLL, la
question n'a pas de sens. Elles seront toutes trois "dans la DLL".
Elles seront ensuite appelées à la demande, soit de façon explicite
(le programme récupère un pointeur sur chaque fonction exportée qu'il
souhaite utiliser, après avoir chargé la DLL), soit de façon
implicite, en laissant Windows se démerder, en gros, comme on utilise
les fonctions API, avec un .h, un .lib, et un .dll.
Le lieur fabrique une cible. Dans le cas que vous proposez, la cible
^^^^^
Je croyais qu'on disait « éditeur de liens » en français. Quand on ne
dit pas carrément « linker »:-).
Tiens, c'est marrant, Microsoft est 100% "Editeur de liens", Borland
Note que de ce point de vue, des DLL ne sont pas des bibliothèques, mais
des fichiers objet.
Je n'utilisais pas le même vocabulaire pour "objet", mais je pense que
Je me pose la question car avec mon compilo (Borland 6) quand je suis
en mode debug je ne peux pas ajouter de points d'arrets sur le code
des fonctions ou classes que je n'utilise pas.
J'en suis très étonné.
L'erreur classique ici, c'est d'avoir mis l'objet dans une bibliothèque.
Alors, si on ne le référence pas directement, il ne fait pas partie du
programme. Et s'il ne fait pas partie du programme, c'est normal que le
debugger ne trouve pas les fonctions qu'il contient.
La question était peut-être mal posée. L'OP parlait d'un fichier .CPP
Le lieur fabrique une cible. Dans le cas que vous proposez, la cible
^^^^^
Je croyais qu'on disait « éditeur de liens » en français. Quand on ne
dit pas carrément « linker »:-).
Tiens, c'est marrant, Microsoft est 100% "Editeur de liens", Borland
Note que de ce point de vue, des DLL ne sont pas des bibliothèques, mais
des fichiers objet.
Je n'utilisais pas le même vocabulaire pour "objet", mais je pense que
Je me pose la question car avec mon compilo (Borland 6) quand je suis
en mode debug je ne peux pas ajouter de points d'arrets sur le code
des fonctions ou classes que je n'utilise pas.
J'en suis très étonné.
L'erreur classique ici, c'est d'avoir mis l'objet dans une bibliothèque.
Alors, si on ne le référence pas directement, il ne fait pas partie du
programme. Et s'il ne fait pas partie du programme, c'est normal que le
debugger ne trouve pas les fonctions qu'il contient.
La question était peut-être mal posée. L'OP parlait d'un fichier .CPP
Le lieur fabrique une cible. Dans le cas que vous proposez, la cible
^^^^^
Je croyais qu'on disait « éditeur de liens » en français. Quand on ne
dit pas carrément « linker »:-).
Tiens, c'est marrant, Microsoft est 100% "Editeur de liens", Borland
Note que de ce point de vue, des DLL ne sont pas des bibliothèques, mais
des fichiers objet.
Je n'utilisais pas le même vocabulaire pour "objet", mais je pense que
Je me pose la question car avec mon compilo (Borland 6) quand je suis
en mode debug je ne peux pas ajouter de points d'arrets sur le code
des fonctions ou classes que je n'utilise pas.
J'en suis très étonné.
L'erreur classique ici, c'est d'avoir mis l'objet dans une bibliothèque.
Alors, si on ne le référence pas directement, il ne fait pas partie du
programme. Et s'il ne fait pas partie du programme, c'est normal que le
debugger ne trouve pas les fonctions qu'il contient.
La question était peut-être mal posée. L'OP parlait d'un fichier .CPP
Borland traite (semble-t-il) le code source directement pour fabriquer
du code objet. Les sorties préprocesseur et assembleur sont des
"dérivations".
Borland traite (semble-t-il) le code source directement pour fabriquer
du code objet. Les sorties préprocesseur et assembleur sont des
"dérivations".
Borland traite (semble-t-il) le code source directement pour fabriquer
du code objet. Les sorties préprocesseur et assembleur sont des
"dérivations".
Traditionnellement, et dans la plupart des systèmes encore aujourd'hui,
la règle est simple : si on spécifie un fichier objet lors de l'édition
de liens, il fait partie du programme. Si en revanche, on met l'objet
dans une bibliothèque, et on spécifie la bibliothèque, le fichier objet
ne fait partie du programme que sous certaines conditions -- en général,
il faut qu'il résoud un symbole externe qui ne serait pas résolu
autrement. (Mais les détails de comment ça marche varie énormement, et
les systèmes Unix fonctionnent bien différemment que Windows à cet
égard.)
Traditionnellement, et dans la plupart des systèmes encore aujourd'hui,
la règle est simple : si on spécifie un fichier objet lors de l'édition
de liens, il fait partie du programme. Si en revanche, on met l'objet
dans une bibliothèque, et on spécifie la bibliothèque, le fichier objet
ne fait partie du programme que sous certaines conditions -- en général,
il faut qu'il résoud un symbole externe qui ne serait pas résolu
autrement. (Mais les détails de comment ça marche varie énormement, et
les systèmes Unix fonctionnent bien différemment que Windows à cet
égard.)
Traditionnellement, et dans la plupart des systèmes encore aujourd'hui,
la règle est simple : si on spécifie un fichier objet lors de l'édition
de liens, il fait partie du programme. Si en revanche, on met l'objet
dans une bibliothèque, et on spécifie la bibliothèque, le fichier objet
ne fait partie du programme que sous certaines conditions -- en général,
il faut qu'il résoud un symbole externe qui ne serait pas résolu
autrement. (Mais les détails de comment ça marche varie énormement, et
les systèmes Unix fonctionnent bien différemment que Windows à cet
égard.)
"Pierre Maurette" a écrit dans le message news:Borland traite (semble-t-il) le code source directement pour fabriquer
du code objet. Les sorties préprocesseur et assembleur sont des
"dérivations".
Il me semble que sur la plupart des compilateurs actuels la sortie
"assembleur" n'est que du pseudo-assembleur reconstitué à partir
des structures de données internes. Autrement dit, cette sortie
mise en forme pour homo sapiens ne sert pas à la compilation
par la suite.
GNU : il suffit d'enlever (ou de renommer) 'as' ou 'as.exe' et de
En revanche il est clair que la phase préprocesseur -> C++ source
"ordinaire" est indispensable à la compilation.
Enfin voilà, c'est ce que j'intuitionne à une heure aussi précoce
de la journée :-)
Pas intuitionnationner, se référer à doc ;-). Borland explique
"Pierre Maurette" <maurette.pierre@free.fr> a écrit dans le message news:
38hrb09q0ocvmuu23ko4pg08bi09qkse8u@4ax.com...
Borland traite (semble-t-il) le code source directement pour fabriquer
du code objet. Les sorties préprocesseur et assembleur sont des
"dérivations".
Il me semble que sur la plupart des compilateurs actuels la sortie
"assembleur" n'est que du pseudo-assembleur reconstitué à partir
des structures de données internes. Autrement dit, cette sortie
mise en forme pour homo sapiens ne sert pas à la compilation
par la suite.
GNU : il suffit d'enlever (ou de renommer) 'as' ou 'as.exe' et de
En revanche il est clair que la phase préprocesseur -> C++ source
"ordinaire" est indispensable à la compilation.
Enfin voilà, c'est ce que j'intuitionne à une heure aussi précoce
de la journée :-)
Pas intuitionnationner, se référer à doc ;-). Borland explique
"Pierre Maurette" a écrit dans le message news:Borland traite (semble-t-il) le code source directement pour fabriquer
du code objet. Les sorties préprocesseur et assembleur sont des
"dérivations".
Il me semble que sur la plupart des compilateurs actuels la sortie
"assembleur" n'est que du pseudo-assembleur reconstitué à partir
des structures de données internes. Autrement dit, cette sortie
mise en forme pour homo sapiens ne sert pas à la compilation
par la suite.
GNU : il suffit d'enlever (ou de renommer) 'as' ou 'as.exe' et de
En revanche il est clair que la phase préprocesseur -> C++ source
"ordinaire" est indispensable à la compilation.
Enfin voilà, c'est ce que j'intuitionne à une heure aussi précoce
de la journée :-)
Pas intuitionnationner, se référer à doc ;-). Borland explique