Précédent   Forum du club des développeurs et IT Pro > C et C++ > Outils pour C & C++
Outils pour C & C++ Forum d'entraide sur les outils de développement pour C & C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/10/2007, 18h18   #1
corentin59
Membre éclairé
 
Avatar de corentin59
 
Inscription : octobre 2006
Messages : 456
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 456
Points : 360
Points : 360
Par défaut créer un dll avec gcc (MinGW)

Bonjour

je souhaite créer une librairie dll à partir de code C et avec mingw (donc sous windows). Plus précisément, j'ai plusieurs fichiers sources (file1.c, file2.c, ...) et je voudrais savoir comment j'obtiens le fichier nom.dll (quelles sont les étapes de compilation) ?

Merci
corentin59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/10/2007, 18h28   #2
Thierry Chappuis
Expert Confirmé Sénior
 
Avatar de Thierry Chappuis
 
Homme Thierry Chappuis
Enseignant Chercheur
Inscription : mai 2005
Messages : 3 481
Détails du profil
Informations personnelles :
Nom : Homme Thierry Chappuis
Âge : 36
Localisation : Suisse

Informations professionnelles :
Activité : Enseignant Chercheur
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : mai 2005
Messages : 3 481
Points : 5 303
Points : 5 303
C'est expliqué ici: http://www.mingw.org/docs.shtml#compilingandbuilding

Thierry
__________________
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

FAQ-Python FAQ-C FAQ-C++

+
Thierry Chappuis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2007, 09h54   #3
corentin59
Membre éclairé
 
Avatar de corentin59
 
Inscription : octobre 2006
Messages : 456
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 456
Points : 360
Points : 360
Merci pour le lien. J'ai fait exactement ce qui est dit et ça ne marche pas. Le code C du fichier dll que je veux obtenir est reparti en trois fichiers .c. L'étape

Code :
 gcc -c -DBUILD_DLL file1.c file2.c file3.c -I C:\Tcl\include
me donne 3 fichiers .o (l'option -I est nécessaire car j'utilise la librairie tcl.h).
Par contre, l'étape

Code :
 gcc -shared -o file.dll -Wl,--out-implib,libtstdll.a file1.o file2.o file3.o
me donne plusieurs erreurs du style

Code :
 file1.o:file1.c:(.text +0xcf): undefined reference to '_imp__Tcl_GetDoubleFromObj'
Les "undefined reference" portent sur les fonctions de tcl.h que j'utilise dans file1.c.

Des idées sur l'origine de cette erreur ?
corentin59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2007, 16h05   #4
aoyou
Membre émérite
 
Inscription : mars 2005
Messages : 860
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 860
Points : 964
Points : 964
Tu dois linker contre une librairie de Tcl, à priori tclx.y (il t'appartient de remplacer x et y par les bonnes valeurs).
Code :
gcc -shared -o file.dll -L C:\Tcl\lib -ltclx.y -Wl,--out-implib,libtstdll.a file1.o file2.o file3.o
A toi de vérifier que les valeurs et les chemins collent.
aoyou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2007, 15h15   #5
corentin59
Membre éclairé
 
Avatar de corentin59
 
Inscription : octobre 2006
Messages : 456
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 456
Points : 360
Points : 360
C'était cela, maintenant, ça marche.

Merci
corentin59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2008, 15h17   #6
k1000
Nouveau Membre du Club
 
Camille Gillot
Étudiant
Inscription : septembre 2007
Messages : 47
Détails du profil
Informations personnelles :
Nom : Camille Gillot
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2007
Messages : 47
Points : 25
Points : 25
Moi aussi j'ai un problème avec le linkage de ma dll mingw :
(la ligne de commande est celle de code::blocks)
Code :
1
2
3
4
5
6
7
8
9
10
g++.exe -shared -Wl,--output-def=.\libsound.def -Wl,--out-implib=.\libsound.a -Wl,--dll -LF:\Irrlicht\lib -LF:\wxWidgets-2.8.7\lib -LF:\zlib-1.2.3\lib  .objs\src\gc.o .objs\src\inlines.o .objs\src\engines\sound\engine.o   -o .\sound.dll -pg -lgmon -mthread  -lwinspool -lwinmm -lshell32 -lcomctl32 -lctl3d32 -lodbc32 -ladvapi32 -lwsock32 -lopengl32 -lglu32 -lole32 -loleaut32 -luuid -lstdc++ F:\Irrlicht\old\lib\libirrKlang.a 
 
.objs\src\engines\sound\engine.o: In function 'ZN85_GLOBAL__N_F__Documents_src_engines_sound_engine.cpp_DFF67DD7_FE9DCE0911engine_implC2EP7GameApp':
F:/Documents/src/engines/sound/engine.cpp:30: undefined reference to 'std::wcout'
F:/Documents/src/engines/sound/engine.cpp:30: undefined reference to 'std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& std::operator<< <wchar_t, std::char_traits<wchar_t> >(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >&, wchar_t const*)'
F:/Documents/src/engines/sound/engine.cpp:30: undefined reference to 'std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& std::operator<< <wchar_t, std::char_traits<wchar_t> >(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >&, wchar_t const*)'
F:/Documents/src/engines/sound/engine.cpp:30: undefined reference to 'std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& std::endl<wchar_t, std::char_traits<wchar_t> >(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >&)'
F:/Documents/src/engines/sound/engine.cpp:30: undefined reference to 'std::basic_ostream<wchar_t, std::char_traits<wchar_t> >::operator<<(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& (*)(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >&))'
F:/Documents/src/engines/sound/engine.cpp:32: undefined reference to 'std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string(wchar_t const*, std::allocator<wchar_t> const&)'
etc...
Code :
1
2
Ligne 30: std::wcout << "quelquechose," << " autrechose" << std::endl;
Ligne 32: std::string chaine("chaine");
Je voudrais savoir ce qu'il faut ajouter pour arrêter ces messages sur la STL.

Merci
k1000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2008, 16h11   #7
k1000
Nouveau Membre du Club
 
Camille Gillot
Étudiant
Inscription : septembre 2007
Messages : 47
Détails du profil
Informations personnelles :
Nom : Camille Gillot
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2007
Messages : 47
Points : 25
Points : 25
Excusez moi, ce n'était pas un problème de dll mais la stl de mingw ne supporte pas les wchar_t.
k1000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2012, 09h39   #8
vinot70
Invité de passage
 
Inscription : avril 2012
Messages : 3
Détails du profil
Informations forums :
Inscription : avril 2012
Messages : 3
Points : 3
Points : 3
Par défaut Problème similaire

Bonjour,
j'ai suivit les indications écrite sur ce forum mais il m'arrive une autre erreur, il me dit que je n'ai pas de fichier en entrée,
J'ai écrit ces lignes dans une makefile,
voila mes deux lignes de compilation

TCLPYTHON= "C:\Program Files\tcl\lib\tclpython-4.1"

gcc -c -DBUILD_DLL -c -mrtd -g -O2 tclpython.c tclthread.c -I "C:\Program Files\tcl\include\" tcl.h

gcc -shared -o $(TCLPYTHON)\tclpython-$(TclPythonVersion)-$(PythonVersion).dll \
-L"C:\Program Files\tcl\include\" -l tcl.h -W1,--output-implib=libtstdll.a tclpython.o tclthread.o
vinot70 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2012, 23h23   #9
aoyou
Membre émérite
 
Inscription : mars 2005
Messages : 860
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 860
Points : 964
Points : 964
Et quel est le message d'erreur ?
aoyou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2012, 08h45   #10
vinot70
Invité de passage
 
Inscription : avril 2012
Messages : 3
Détails du profil
Informations forums :
Inscription : avril 2012
Messages : 3
Points : 3
Points : 3
Par défaut message d'erreur

message d'erreur :

gcc:erreur fatale pas de fichier à l'entrée
Images attachées
Type de fichier : jpg Capturer.JPG (46,0 Ko, 2 affichages)
vinot70 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2012, 13h54   #11
aoyou
Membre émérite
 
Inscription : mars 2005
Messages : 860
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 860
Points : 964
Points : 964
C'est bien la première commande qui ne marche pas ?

Dans la ligne suivante,
Code :
gcc -c -DBUILD_DLL -c -mrtd -g -O2 tclpython.c tclthread.c -I "C:\Program Files\tcl\include\" tcl.h
enlève tcl.h. Un .h ça ne se compile pas. Et je ferais plutôt
Code :
gcc -c -DBUILD_DLL -mrtd -g -O2 -I "C:\Program Files\tcl\include\" tclpython.c tclthread.c
aoyou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2012, 10h52   #12
vinot70
Invité de passage
 
Inscription : avril 2012
Messages : 3
Détails du profil
Informations forums :
Inscription : avril 2012
Messages : 3
Points : 3
Points : 3
Cela était bien une erreur sur la première ligne, mais je n'ai pas mis les .c en dernier sinon cela ne fonctionnais pas

il faut que je modifie les liens de mes fichiers maintenant, ce qui n'est pas vraiment évident vu que chaques fichiers renvoie vers d'autre .h

Sauriez vous qu'elle est la différence lorsque l'on fais appel a des include entre :
<io.h> et "io.h"
vinot70 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2012, 20h23   #13
aoyou
Membre émérite
 
Inscription : mars 2005
Messages : 860
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 860
Points : 964
Points : 964
Citation:
Le nom du fichier peut être soit à l'intérieur des chevrons < et >, soit entre guillemets :
* #include <nom_fichier> Inclut le fichier nom_fichier en le cherchant d'abord dans les chemins configurés, puis dans le même répertoire que le fichier source,
* #include "nom_fichier" Inclut le fichier nom_fichier en le cherchant d'abord dans le même répertoire que le fichier source, puis dans les chemins configurés.
aoyou est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h18.


 
 
 
 
Partenaires

Hébergement Web