compilation sur gcc et sur vc++

compilation sur gcc et sur vc++ - C++ - Programmation

Marsh Posté le 21-07-2005 à 11:33:49    

Voila, j'ai un probleme de compilation.
 
J'ai un programme que je peux compiler sans probleme avec visual c++, mais avec gcc, il me renvoie des erreurs:
 

Citation :


In file included from Ad125ex.cpp:5:
pcdaq.h:186:20: warning: no newline at end of file
C:\DOCUME~1\blaporte.CST\LOCALS~1\Temp/ccw1baaa.o(.text+0x2c):Ad125ex.cpp: undef
ined reference to `daqCmd@20'
C:\DOCUME~1\blaporte.CST\LOCALS~1\Temp/ccw1baaa.o(.text+0x62):Ad125ex.cpp: undef
ined reference to `daqCmd@20'
C:\DOCUME~1\blaporte.CST\LOCALS~1\Temp/ccw1baaa.o(.text+0x98):Ad125ex.cpp: undef
ined reference to `daqCmd@20'
C:\DOCUME~1\blaporte.CST\LOCALS~1\Temp/ccw1baaa.o(.text+0xcf):Ad125ex.cpp: undef
ined reference to `daqCmd@20'
C:\DOCUME~1\blaporte.CST\LOCALS~1\Temp/ccw1baaa.o(.text+0x3f9):Ad125ex.cpp: unde
fined reference to `daqCmd@20'
C:\DOCUME~1\blaporte.CST\LOCALS~1\Temp/ccw1baaa.o(.text+0x4db):Ad125ex.cpp: more
 undefined references to `daqCmd@20' follow
collect2: ld returned 1 exit status


 
Et je comprend pas pourquoi je peux compiler avec l'un mais pas avec l'autre.
 
Merci

Reply

Marsh Posté le 21-07-2005 à 11:33:49   

Reply

Marsh Posté le 21-07-2005 à 11:54:59    

Je suis loin d'être un pro de gcc mais on dirait qu'il te manque des librairies quand tu fais ton édition de lien... Faudrait comparer les options du compilateur dans Visual C++ avec celle que tu passes à gcc...


Message édité par _p1c0_ le 21-07-2005 à 11:55:38

---------------
-_- http://www.scienceshopping.com -_-
Reply

Marsh Posté le 21-07-2005 à 12:43:48    

L'ennui étant que je n'y connais rien sur vc++ et que je suis donc incapable de savoir à quoi corresponde les différentes option...

Reply

Marsh Posté le 21-07-2005 à 13:01:13    

déjà compile en -Wall

Reply

Marsh Posté le 21-07-2005 à 14:21:05    

ta un problème de référence je crois :D


---------------
http://www.blastmanu.info
Reply

Marsh Posté le 21-07-2005 à 16:17:49    

Qu'appelles tu "probleme de reference"?  
 

Reply

Marsh Posté le 21-07-2005 à 18:52:31    

il te manque la librairie que tu dois lier statiquement à ton projet, et qui contient la fonction daqCmd() (ou un truc approchant)
attention : sous VC++ et sous GCC, le format des librairies est différent (.lib pour VC++, lib*.a pour GCC)


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 22-07-2005 à 09:51:52    

En theoris, dans ce programme, je n'ai besoin d'aucune librairi suplémentaire.
daqCmd() utilise un .h, mais pas de librairie.  
 
Je n'arrive pas à comprendre comment savoir qu'elle librairi vc++ utilise qui n'est pas disponible  à gcc et pourquoi il utiliserai cette librairie étant donné que je ne le lui demande pas.


Message édité par blaise_laporte le 22-07-2005 à 10:53:34
Reply

Marsh Posté le 22-07-2005 à 11:14:18    

daqCmd n'utilise pas que un .h il ya  forcement un compilé qqpart dans un lib ou un a ...

Reply

Marsh Posté le 22-07-2005 à 11:30:52    

J'ai l'impressison que tu es confronté à l'absence de "transparence" de Visual C++, ce qui fait que, sans ouvrir le projet et chercher dedans, tu ne sais pas quelle librarie sont appelées par défaut et liée lors de l'éditiond de liens.
Avec gcc, tu dois avoir des libraries équivalentes encore faut-il savoir desquelles il s'agit et les trouver !
 
Quel " .h " daqCmd utilise-t-il ? Ce sera une indication de la librairie à chercher.

Reply

Marsh Posté le 22-07-2005 à 11:30:52   

Reply

Marsh Posté le 22-07-2005 à 11:43:19    

moi je crois surtotu que sa ligne de commande/make pour gcc est foireuse et n'inclue pas le .o qui va bien
 
tu peux nous poster ca ?

Reply

Marsh Posté le 22-07-2005 à 11:46:58    

Citation :

J'ai l'impressison que tu es confronté à l'absence de "transparence" de Visual C++, ce qui fait que, sans ouvrir le projet et chercher dedans, tu ne sais pas quelle librarie sont appelées par défaut et liée lors de l'éditiond de liens.


 
J'ai en effet un véritable probleme avec vc++...
 

Citation :


Quel " .h " daqCmd utilise-t-il ? Ce sera une indication de la librairie à chercher.


 
En faite, j'utilise un .h fournit par un fabriquant de carte d'acquisition pour piloter sa carte. En fouillant dans tout les fichier fournit, j'ai finis par trouver le .LIB!
 
Mais d'aprés ce que j'ai compris, ce .LIB n'est pas utilisable avec gcc. y a t'il un moyen pour le tranformé en librairi compatible avec gcc?
 
Merci

Reply

Marsh Posté le 22-07-2005 à 11:47:52    

a part recompiler la chsoe non :o
bienvenue dans le monde des bibliotheques proprio :o

Reply

Marsh Posté le 22-07-2005 à 11:50:03    

chrisbk a écrit :

moi je crois surtotu que sa ligne de commande/make pour gcc est foireuse et n'inclue pas le .o qui va bien
 
tu peux nous poster ca ?


 
Pour le moment, je cherche juste à compilé le programme, et je n'inclus en effet aucun .o
 

Citation :


gcc Ad125ex.cpp


 
Mais s'il y a un probleme de librairi, je penserai plus pour ce probleme: pourquoi faudrait-il que j'inclut le .o ?    :??:

Reply

Marsh Posté le 22-07-2005 à 12:11:36    

faut utiliser g++ si tu compiles du C++ :o


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 22-07-2005 à 12:12:59    

ta fonction daqCmd, elle est définie dans quel fichier ? (et me reponds pas un .h, s'il te plait [:petrus75])

Reply

Marsh Posté le 22-07-2005 à 12:24:56    

Citation :

faut utiliser g++ si tu compiles du C++ :o


 
Je prefere en effet utilisé gcc, mais visiblement, certaine fonction de mon pragramme qui commmande la carte d'acquisition ne sont utilisabla que sous vc++.
 

Citation :

ta fonction daqCmd, elle est définie dans quel fichier ? (et me reponds pas un .h, s'il te plait [:petrus75])


 
La fonction daqCmd, si j'ai bien compris, est definie dans un fichier PCDAQ.LIB.
 

Reply

Marsh Posté le 24-07-2005 à 09:24:35    

Juste un truc au passage, si tu dois ecrire un truc portable, il vaut mieux ecrire ton code pour g++ -Wall et compiler ensuite avec vc++ que l'inverse, parce que g++ est plus strict. Tu auras moins de pb de cette maniere, et un code qui passe impec sous g++ a de fortes chances de compiler impec sous vc++, le contraire n'etant pas le cas.
 
Par ex, le warning que tu as
"pcdaq.h:186:20: warning: no newline at end of file "
 
c'est nouveau et c'est chiant, mais ca ne m'etonnerait pas que ce soit requis par la norme, et ca permet d'uniformiser le code.
 
Quand a ton pb de lib proprio, soit le fournisseur de la carte a une lib pour gcc (attention a la version avec laquelle ca a ete compile), soit tu peux laisser tomber.

Reply

Marsh Posté le 24-07-2005 à 09:27:29    

c'est requis. Ça vient du C.

Reply

Marsh Posté le 24-07-2005 à 10:37:27    

c'est pas nouveau le No newlien at end of line [:pingouino]

Reply

Marsh Posté le 24-07-2005 à 10:43:19    

Joel F a écrit :

a part recompiler la chsoe non :o
bienvenue dans le monde des bibliotheques proprio :o


 
ben si. pexports, reimp et dlltool, c'est pas fait pour les chiens :o

Reply

Marsh Posté le 24-07-2005 à 10:53:39    

han han ... tu me dis comment ca marche alors je vois comment tu peut reprendre des binaires compilées VC6 pour en faire un .a gcc [:pingouino]

Reply

Marsh Posté le 24-07-2005 à 11:03:05    

Joel F a écrit :

han han ... tu me dis comment ca marche alors je vois comment tu peut reprendre des binaires compilées VC6 pour en faire un .a gcc [:pingouino]


 
ben, il faut lui donner les symboles qu'on veut avoir dans son .a et la dll à mouliner pour trouver les symboles en question (je sens venir le "oui mais si tu as une lib statique?" ).

Reply

Marsh Posté le 24-07-2005 à 11:04:22    

mais le reste de l'ABI est compatible ?

Reply

Marsh Posté le 24-07-2005 à 11:08:00    

Taz a écrit :

mais le reste de l'ABI est compatible ?


 
le reste de quoi compatible avec quoi? (tout ce que font les outils de ce genre, c'est générer des .a que peux comprendre gcc pour se bouffer une dll. Le code binaire, ils ne le changent pas.)

Reply

Marsh Posté le 24-07-2005 à 11:13:25    

bah le reste de l'ABI, y bien d'autres choses à part le mangling qui diffère ?

Reply

Marsh Posté le 24-07-2005 à 12:04:38    

l'ABI vc6 est certainement pas compatible gcc :|

Reply

Marsh Posté le 25-07-2005 à 06:44:15    

Taz a écrit :

bah le reste de l'ABI, y bien d'autres choses à part le mangling qui diffère ?


 
Ben, à ma connaissance, krosoft n'a jamais publié d'ABI C ou C++ pour sa plateforme. Il y a bien le PE mais c'est plutôt léger. A mon avis, les mecs de MinGW ont dû décompiler des binaires histoire d'être sûrs d'être compatibles (je pense en particulier au niveau des conventions d'appels où, si ma mémoire est bonne, msvc utilise par exemple en C++ ecx pour passer l'adresse de l'objet). Mais bref, au final, c'est compatible au niveau des binaires exécutables, pas au niveau des binaires objets, et dans quelle mesure, je n'en sais rien.
Enfin, pour le sujet du topic, il suffit de lire la doc:
 
http://www.mingw.org/mingwfaq.shtml#faq-msvcdll
 


How can an MSVC program call a MinGW DLL, and vice versa?
Assume we have a testdll.h, testdll.c, and testmain.c. In the first case, we will compile testdll.c with MinGW, and let the MSVC-compiled testmain call it. You should use
 
gcc -shared -o testdll.dll testdll.c \
    -Wl,--output-def,testdll.def,--out-implib,libtestdll.a  
to produce the DLL and DEF files. MSVC cannot use the MinGW library, but since you have already the DEF file you may easily produce one by the Microsoft LIB tool:  
lib /machine:i386 /def:testdll.def  
Once you have testdll.lib, it is trivial to produce the executable with MSVC:
 
cl testmain.c testdll.lib  
Now for MinGW programs calling an MSVC DLL. We have two methods. One way is to specify the LIB files directly on the command line after the main program. For example, after
 
cl /LD testdll.c  
use  
gcc -o testmain testmain.c testdll.lib  
The other way is to produce the .a files for GCC. For __cdecl functions (in most cases), it is simple: you only need to apply the reimp tool from Anders Norlander (since his web site is no longer available, you may choose to download here a version enhanced by Jose Fonseca):
 
reimp testdll.lib
gcc -o testmain testmain.c -L. -ltestdll  
However, for __stdcall functions, the above method does not work. For MSVC will prefix an underscore to __stdcall functions while MinGW will not. The right way is to produce the DEF file using the pexports tool included in the mingw-utils package and filter off the first underscore by sed:
 
pexports testdll.dll | sed "s/^_//" > testdll.def  
Then, when using dlltool to produce the import library, add `-U' to the command line:  
dlltool -U -d testdll.def -l libtestdll.a  
And now, you can proceed in the usual way:  
gcc -o testmain testmain.c -L. -ltestdll  
Hooray, we got it.


Message édité par docmaboul le 25-07-2005 à 06:49:40
Reply

Marsh Posté le 25-07-2005 à 10:15:11    

Merci beaucoup pout toute vos reponse qui m'ont permis de resoudre mon probleme et d'en aprendre beaucoup sur les .LIB et .DLL
 
[:athome]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed