Compiler une DLL en C

Fermé
Alex - 14 juin 2004 à 05:52
 Alex Swartzkaiser - 30 juin 2004 à 03:26
Bonjour
Je dois realiser une bibliotheque en pur C pour Windows xxx, elle doit etre sous forme d'une DLL. Pour des raisons de portabilite, je n'ai pas le droit d'utiliser un assistant du style Visual C et autre Builder, je doit la definir et la compiler a la main. Elle doit juste me permettre d'acceder a tout un tas de fonctions.

Le probleme, c'est que je suis issu du monde Unix, aussi la programmation Windows m'echappe quelque peu. Je ne trouve pas de docs utilisables pour faire une DLL a la main... Peut-on repondre a mes questions ?

1/ Quelle est la procedure pour creer une DLL a la main ?
2/ Quelle est la procedure pour appeller les fonctions de ma DLL ?
3/ Si n programmes appellent la meme fonction de la meme DLL, dois-je gerer moi meme la concurrence des acces ?

Juste un lien vers un site peut deja mettre utile...
D'avance merci.
(Salut Tafiscobar !!!)

7 réponses

Canard007 Messages postés 5929 Date d'inscription mercredi 26 mai 2004 Statut Contributeur Dernière intervention 18 septembre 2009 215
14 juin 2004 à 10:14
Salut,

moi pour le faire j utilise cygwin....
et voici la procedure que j utilise et que je pense portable sur la plupart des compilateur...

donc en 1 je compile 1 a 1 tous les fichier .C
gcc -c -I"les includes particuliers" -o monfichier.o monfichier.c
ensuite je crée un fichier .def qui va referencer l ensemble des fonctions dedans il y a donc qq chose du genre:
EXPORTS
mafonction1
mafonction2
etc...
et ensuite je realise la creation de la dll:
gcc -shared -I"les includes perticuliers(chemin)" -o madll.dll monfichier.c monautrefichier.c monfichierdef.def
et hop tu as ta dll..

Sinon pour la concurence des accé il n'y a aucun probleme moi j ai +thread qui utilisent les meme fonctions d'une de mes dll et ca marche sans probleme.

j'espere t avoir aidé...
bon courage
4
Encore une victoire de Canard hihi !
Bon oui, c'est presque ca... Mais quelques precisions me seraient precieuses :
1/ Comment tu definis le point d'entree dans ta DLL (L'equivalent du main poun programme classique) ?
2/ J'ai lu qui fallait generer un .lib, pour des raisons obscures...
3/ Comment j''accede au fonctions de la DLL, sachant que je possede les headers de ces fonctions ?
0
_julien_ Messages postés 56 Date d'inscription lundi 31 mai 2004 Statut Membre Dernière intervention 31 juillet 2004 17
14 juin 2004 à 09:08
Tu peux utiliser MinGW, tu ne seras pas trop perdu comme ca :)
A cette page ils expliquent comment creer une dl:
http://www.mingw.org/docs.shtml -> How to create a dll

-- 
julien barbier
1
Aie, au risque de paraitre difficile, ta solution ne me convient pas. Car avec MinGW, on fait deux trois appels "magiques", et hop, la DLL apparait. Ce qui revient a des assistants. Je n'ai pas droit au solutions "baguette magiques" ! Je dois pouvoir ecrire les makefiles pour n''importe quel compilateur, avec les memes fichiers sources. Et bien sur, pas question de maintenir une version des fichiers pour VC, une pour MinGw, une pour xxx, ...
1
Canard007 Messages postés 5929 Date d'inscription mercredi 26 mai 2004 Statut Contributeur Dernière intervention 18 septembre 2009 215
14 juin 2004 à 11:43
re,
bon pour le point d'entrée je ne crois pas que cela soit necessair la dll peur ne contenir qu'une succession de fonctions.
Pour le .lib j en ai aucune idée jamais u besoin...
Enfin moi je me sert des dll pour faire du jni..interface avec java...donc je les appel avec java en utilisant la fonction loadlibrary...
Mais je suppose qu en c/c++ c est le meme principe tu charge la lib et apres tu utilise les fonctions direct
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tafiscobar Messages postés 1277 Date d'inscription jeudi 7 décembre 2000 Statut Contributeur Dernière intervention 26 février 2009 177
14 juin 2004 à 13:13
salut Alex et au pays, t'as deja commecencé a coder??
peut etre que ceci va t'aider (c'est vrai que ds la plupart, ils expliquent avec les outils, alors q les gens veulent savoir comment ca marche) : http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/vccore/html/_core_export_from_a_dll.asp

t'as ça aussi : http://www-igm.univ-mlv.fr/~dr/Xpose2001/legeay/

tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!
1
Salut Tafiscobar

Ton lien et les reponses precedentes m'ont permis de bien avancer, merci beaucoup. Je ne code pas encore, mais j'ai mis au point une conception d'ensemble et elle a ete valide par l'equipe du labo.
Je mets en place la chaine de compilation, plutot complexe, car il faut que ca compile pour Linux, VisualC, BorlandC, et des kits de developpement pour materiel embarques !!!
J'utilise Ant et du Xslt pour generer des scripts specifiques a la plateforme. Du code XML qui genere du code scripts qui genere du code C qui genere les librairies. Ouf !!!!!!!
0
Canard007 Messages postés 5929 Date d'inscription mercredi 26 mai 2004 Statut Contributeur Dernière intervention 18 septembre 2009 215
15 juin 2004 à 09:53
lol
have fun :p
0
Bonjour

pour créer une DLL, je te conseille d'aller sur le site de microsoft:
http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/vccore/html/_core_set_compiler_options.asp.
Moi aussi, je m'amuse à compiler ces DLL, un vrai plaisir....
BOn courage.
Mais si qq a une méthode je suis preneur

Emmanuel
0
Alex Swartzkaiser
30 juin 2004 à 03:26
- Imagine que tu est 6 fonctions (fonction1, fonction2,...) a inclure dans ta DLL, decrites dans 4 fichiers C (fichier1.c, fichier2.c,...)
- Imagine que tu est VisualC++ installe.

Voila ma recette :
- Lancer vcvars32.bat

- Fabriquer les .obj pour chaque fichier, ce qui ce fait avec
cl [options de compilations] fichier1.c -Fofichier1.obj -c

Il ya une option speciale du compilateur Microsoft pour optimiser specialement pour une DLL...

- Avoir un fichier .DEF (un fichier Ascii tout simple), qui permet de dire quelles fonctions vont figurer dans ta DLL, avec quel nom et quel position... Tu peut aussi preciser d'autres parametres dans .DEF, voir sur MSDN. Ici le fichier aura cette tete :
DESCRIPTION "Ma DLL avec 6 fonctions"
EXPORT
fonction1 @1
fonction2 @2
fonction3 @3
fonction4 @4
fonction5 @5
fonction6 @6

Les numeros avec @ doivent etre uniques. En fait, j''ai un fichier XML avec mes noms fonctions, et une jolie feuille de style XSLT qui me genere mon .DEF avec les numeros, pour etre sur de faire de doublon. Apellons ce fichier MaDll.def

- Fabriquer la DLL, ce qui est le travail du linker. Elle s''apellera MaDll.dll
link -dll -def:MaDll.def -out:MaDll.dll fichier1.obj fichier2.obj fichier3.obj fichier4.obj


Et tu obtiendras 2 fichiers, MaDll.dll ainsi que MaDll.lib.

- Pour utiliser ta dll, tu dois lier l''executable avec MaDll.lib

Mais ma recette n''est pas encore parfaite... Je ne peut pas faire d''entree sorties car elles plantent systematiquement avec un programme qui utilise la Dll (les fonctions d''ES sont dans la DLL). Alors que si je lie statiquement, ca marche. Je ne sais pas pourquoi...
0