Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Compiler du code C code avec gcc pour faire une DLL

9 réponses
Avatar
PhilTheGap
Bonjour,

savez-vous comment je pourrais compiler du code C avec gcc sur Unix pour
produire une dll utilisable sur Windows ?

Merci de vos lumières !

Philippe

9 réponses

Avatar
Mickaël Wolff
PhilTheGap a écrit :

savez-vous comment je pourrais compiler du code C avec gcc sur Unix pour
produire une dll utilisable sur Windows ?



Tu auras des réponses pertinentes sur fr.comp.os.ms-windows.programmation

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
Charlie Gordon
"Mickaël Wolff" a écrit dans le message de news:
491dacdb$0$16972$
PhilTheGap a écrit :

savez-vous comment je pourrais compiler du code C avec gcc sur Unix pour
produire une dll utilisable sur Windows ?



Tu auras des réponses pertinentes sur
fr.comp.os.ms-windows.programmation



Il me semble que la suite mingw est exactement ce que tu cherches.

--
Chqrlie
Avatar
-ed-
On 14 nov, 17:07, "PhilTheGap" wrote:
Bonjour,

savez-vous comment je pourrais compiler du code C avec gcc sur Unix pour
produire une dll utilisable sur Windows ?



Il est peu probable que tu puisses générer du code pour Windows sur
une machine Unix (ou alors au prix de cross-compilations compliquées,
et rien ne sera vérifiable...). La logique est d'utiliser une machine
Windows... Ensuite, CygWin, MinGW etc.

Écrire du code et le compiler, c'est rien. Ce qui compte vraiment,
c'est de le tester correctement dans les conditions réelles... Pour
ça, il faut une machine Windows, et l'envirennement de développement
qui va avec (pour une DLL, je recommande Visual Studio Express).
Avatar
espie
In article ,
-ed- wrote:
On 14 nov, 17:07, "PhilTheGap" wrote:
Bonjour,

savez-vous comment je pourrais compiler du code C avec gcc sur Unix pour
produire une dll utilisable sur Windows ?



Il est peu probable que tu puisses générer du code pour Windows sur
une machine Unix (ou alors au prix de cross-compilations compliquées,
et rien ne sera vérifiable...). La logique est d'utiliser une machine
Windows... Ensuite, CygWin, MinGW etc.



Ne le decourage pas comme ca. A priori, c'est complique, mais c'est faisable.
Les toolchains de type cygwin sont quand meme du pur binutils et gcc, et
c'est cense pouvoir cross-compiler, ces engins-la. Surtout s'il part d'un
i386, il n'y a pas tant de differences que ca, ca a des chances non nulles
de fonctionner (et des chances non nulles de tomber sur quelques bugs, mais
bon...)
Avatar
PhilTheGap
Merci de vos réponses à tous...
Avatar
PhilTheGap
Salut Ed,
"-ed-" a écrit dans le message de
news:
On 14 nov, 17:07, "PhilTheGap" wrote:
Bonjour,

savez-vous comment je pourrais compiler du code C avec gcc sur Unix pour
produire une dll utilisable sur Windows ?



Il est peu probable que tu puisses générer du code pour Windows sur
une machine Unix (ou alors au prix de cross-compilations compliquées,
et rien ne sera vérifiable...). La logique est d'utiliser une machine
Windows... Ensuite, CygWin, MinGW etc.


Oui justement on utilise Cygwin !! Bon alors tu vas me dire: pourquoi ne
l'as tu pas dit avant ? Eh bien c'est parce que je suis l'interprète de
quelqu'un d'autre et que moi même je comprends au fur et à mesure...

Donc je reprends: on veut utiliser du code (de fait, nous l'avons ce code)
Cygwin parce qu'il tourne bien (c'est un produit que l'on vend) mais nous
voulons l'utiliser avec une nouvelle interface graphique .Net sous Windows
(WPF). Donc nous ne voulons pas porter le code en .NET.

Donc l'appli est écrite en .NET pour l'interface et appelle du code Cygwin,
que l'on va donc devoir charger en tant que DLL. C'est là qu'est l'os. On
peut compiler et faire une DLL mais nous avons le droit ensuite dans le code
.Net à un DllNotFoundException (pourtant on fait un DLLImport et tout ce
qu'il faut en .Net).

En creusant un peu on s'est rendu compte qu'il manquait un "point d'entrée"
DLL_Main pour que celle ci soit chargée (comme par ex user32.dll que nous
chargeons sans pb).

Donc maitenant la question est: comment crééer ce DLL_Main dans le code
Cygwin ??????

Merci de votre attention

Cordialement
Avatar
Antoine Leca
En news:492298b2$0$28670$, PhilTheGap va
escriure:
savez-vous comment je pourrais compiler du code C avec gcc sur Unix
pour produire une dll utilisable sur Windows ?





Oui justement on utilise Cygwin !!



Huh ? Tu utilises Cygwin (le « win » veut dire que cela tourne sur WINdows,
nous sommes d'accord ?), ou tu utilises Unix, comme plateforme de
développement ?


Donc je reprends: on veut utiliser du code (de fait, nous l'avons ce
code) Cygwin parce qu'il tourne bien (c'est un produit que l'on vend)
mais nous voulons l'utiliser avec une nouvelle interface graphique
.Net sous Windows (WPF). Donc nous ne voulons pas porter le code en
.NET.

Donc l'appli est écrite en .NET pour l'interface et appelle du code
Cygwin, que l'on va donc devoir charger en tant que DLL.



Si je suis bien, tu veux recompiler sous forme de DLL un code qui
actuellement est écrit (je suppose sous forme d'application) pour GCC, y
compris Cygwin. Correct ?

[ Ce que je ne veux pas essayer de comprendre, c'est si tu demandes de
l'aide pour transformer du code C existant en code « géré » à la mode CLI,
car c'est évidemment hors charte ici, donc ce n'est sûrememnt pas là qu'est
ta question. ]


C'est là qu'est l'os.



Ce n'est pas un os. Le machin que tu cherches s'appelle dlltool, et devrait
faire partie des outils disponibles sur ta plateforme de développement. Il
s'agit de la version GCC du « bidule pour émettre des DLLs ».
Pour les détails, je crains ne pas pouvoir t'aider plus, d'abord parce que
c'est explicitement hors charte sur ce forum (voir
fr.comp.os.ms-windows.programmation comme indiqué précédement si ce n'est
pas déjà fait), et ensuite parce que GCC a pas mal zizagué sur ce sujet, et
je n'ai pas investi mon temps à essayer de comprendre les détails des
zigzags ; bien sûr Google va t'apprendre plein de choses sur cet outil, y
compris certainement des recettes prêtes-à-consommer...


On peut compiler et faire une DLL mais nous avons le
droit ensuite dans le code .Net à un DllNotFoundException (pourtant
on fait un DLLImport et tout ce qu'il faut en .Net).



Là, c'est encore plus hors sujet sur ce forum, car il s'agit d'un problème
CLI voire CLR, cela n'a rien à voir avec du C (en gros, si je fais une DLL
avec Delphi ou FreePascal ou le Fortran ou l'Ada de GCC j'aurais exactement
le même souci, pour exactement la même raison.)


En creusant un peu on s'est rendu compte qu'il manquait un "point
d'entrée" DLL_Main pour que celle ci soit chargée (comme par ex
user32.dll que nous chargeons sans pb).



C'est de la cuisine basique de DLL version Win32, cf. le groupe indiqué
ci-dessus ou n'importe quel source d'information sur le sujet, Google,
bouquin sur la programmation Win32 genre Petzold, MSDN, comme tu veux. il y
a foison.

<HS mais="conseil perso">
Petzold (/Programmer [sous] Microsoft Windows/, éd. Microsoft Press) sur ce
sujet des DLL, c'est probablement un bon investissement, même si je ne sais
pas si la VF est à jour (et évidemment il ne faut pas se fier aux vieux
bouquins qui concernent Win3.x). En moins de 2 minutes de Google je suis
d'ailleurs tombé sur http://www.computersciencelab.com/Petzold.htm. Qui peut
probablement t'intéresser si tu maîtirise la langue de Charles.
</HS>


Donc maitenant la question est: comment crééer ce DLL_Main dans le
code Cygwin ??????



[ Change de clavier, certaines touches ont des problèmes de répétition. ]

En le définissant ?


Sinon, info dlltool, ou option -e de GNU ld


Antoine
Avatar
PhilTheGap
Bonjour Antoine,

désolé si un partie de ce que j'expose est hors charte, mais n'étant pas
schizo, je ne peux pas oublier que le but est d'écrire un code qui puisse
être chargé par .Net.

Mon but est simple mais le reconnais qu'un dessin arrangerait bien les
choses !
Je veux compiler un code avec CygWin de façon à en faire une DLL utilisable
par .Net.
Or je peux effectivement la créer, mais elle provoque une exception au
chargement avec .Net.
Je pense (ou plutôt mon collègue codeur) que c'est parce qu'il manque une
fonction DllMain.
Donc ma question est : comment créer cette DllMain avec CygWin ?

Voilà

"Antoine Leca" a écrit dans le message de
news:gfuubs$nc7$
En news:492298b2$0$28670$, PhilTheGap va
escriure:
savez-vous comment je pourrais compiler du code C avec gcc sur Unix
pour produire une dll utilisable sur Windows ?





Oui justement on utilise Cygwin !!



Huh ? Tu utilises Cygwin (le « win » veut dire que cela tourne sur
WINdows,
nous sommes d'accord ?), ou tu utilises Unix, comme plateforme de
développement ?


Donc je reprends: on veut utiliser du code (de fait, nous l'avons ce
code) Cygwin parce qu'il tourne bien (c'est un produit que l'on vend)
mais nous voulons l'utiliser avec une nouvelle interface graphique
.Net sous Windows (WPF). Donc nous ne voulons pas porter le code en
.NET.

Donc l'appli est écrite en .NET pour l'interface et appelle du code
Cygwin, que l'on va donc devoir charger en tant que DLL.



Si je suis bien, tu veux recompiler sous forme de DLL un code qui
actuellement est écrit (je suppose sous forme d'application) pour GCC, y
compris Cygwin. Correct ?

[ Ce que je ne veux pas essayer de comprendre, c'est si tu demandes de
l'aide pour transformer du code C existant en code « géré » à la mode CLI,
car c'est évidemment hors charte ici, donc ce n'est sûrememnt pas là
qu'est
ta question. ]


C'est là qu'est l'os.



Ce n'est pas un os. Le machin que tu cherches s'appelle dlltool, et
devrait
faire partie des outils disponibles sur ta plateforme de développement. Il
s'agit de la version GCC du « bidule pour émettre des DLLs ».
Pour les détails, je crains ne pas pouvoir t'aider plus, d'abord parce que
c'est explicitement hors charte sur ce forum (voir
fr.comp.os.ms-windows.programmation comme indiqué précédement si ce n'est
pas déjà fait), et ensuite parce que GCC a pas mal zizagué sur ce sujet,
et
je n'ai pas investi mon temps à essayer de comprendre les détails des
zigzags ; bien sûr Google va t'apprendre plein de choses sur cet outil, y
compris certainement des recettes prêtes-à-consommer...


Oui ce sont justement ce genre de détails chiants qui font perdre aux gens
plusieurs jours...de recheche sur Google.
D'où mes questions ici.

On peut compiler et faire une DLL mais nous avons le
droit ensuite dans le code .Net à un DllNotFoundException (pourtant
on fait un DLLImport et tout ce qu'il faut en .Net).



Là, c'est encore plus hors sujet sur ce forum, car il s'agit d'un problème
CLI voire CLR, cela n'a rien à voir avec du C (en gros, si je fais une DLL
avec Delphi ou FreePascal ou le Fortran ou l'Ada de GCC j'aurais
exactement
le même souci, pour exactement la même raison.)


Tu n'es pas obligé de lire cette partie de l'exposé hors sujet. Mais dans ce
cas tu risques de me poser encore des questions pour savoir où je veux en
venir. Note bien que je ne demande rien sur .Net, je tente juste d'expliquer
pourquoi j'ai besoin d'un point d'entrée DllMain.


En creusant un peu on s'est rendu compte qu'il manquait un "point
d'entrée" DLL_Main pour que celle ci soit chargée (comme par ex
user32.dll que nous chargeons sans pb).



C'est de la cuisine basique de DLL version Win32, cf. le groupe indiqué
ci-dessus ou n'importe quel source d'information sur le sujet, Google,
bouquin sur la programmation Win32 genre Petzold, MSDN, comme tu veux. il
y
a foison.


Je ne suis pas sûr que ce soit basique. Je pense qu'on peut encore tomber
sur un certain nombre de "détails" de compilation

Merci de ta réponse. Je note DllTool !

Cordialement
Avatar
Antoine Leca
En news:4923db37$0$28673$, PhilTheGap va
escriure:
désolé si un partie de ce que j'expose est hors charte, mais n'étant
pas schizo, je ne peux pas oublier que le but est d'écrire un code
qui puisse être chargé par .Net.



Désolé mais c'est justement cela qui me chagrinne.

Ton problème (maintenant que tu nous l'as exposé en entier) est que tu
arrives à créer une DLL avec tes outils, mais cette DLL n'est pas chargée
correctement par l'environnement CLI (.Net), parce que cette plateforme
diverge du standard Win32 en obligeant à ce que le point d'entrée de la DLL
(qui est nommé conventionnellement DllMain) soit explicitement *exporté* (en
Win32, il est implicitement désigné par un pointeur dans le format PE-COFF,
pointeur qui s'appelle point d'entrée).

Si tu relis mon paragraphe ci-dessus, tu comprendras peut-être pourquoi je
suis bougon: C n'est cité à aucun moment...


Maintenant, la réponse à cette question est, pour l'outil GCC, de rajouter

__declspec (dllexport)

au début de la définition de la fonction DllMain.

(Et évidemment, si tu n'as pas de fonction DllMain, il faudra en ajouter une
; pour info, elle prend trois paramètres, et la version triviale renvoie
systématiquement 1, qui veut dire roule-ma-poule.)


Je veux compiler un code avec CygWin de façon à en faire une DLL
utilisable par .Net.



Bien. Dans news:491da24f$0$28675$, c'était :
: savez-vous comment je pourrais compiler du code C avec gcc sur Unix
: pour produire une dll utilisable sur Windows ?


Ce qui m'amuse le plus, c'est qu'il y a plus de lettres à taper dans le
message original que dans celui auquel je répond ici.


Merci de ta réponse. Je note DllTool !



En fait, tu vas préférer utiliser dllwrap. Mais renseigne-toi sur les deux.


Antoine