ODE : link errors à la compilation

Résolu
cs_Tibabou Messages postés 130 Date d'inscription mercredi 2 janvier 2002 Statut Membre Dernière intervention 7 juillet 2012 - 8 déc. 2007 à 20:22
cs_Tibabou Messages postés 130 Date d'inscription mercredi 2 janvier 2002 Statut Membre Dernière intervention 7 juillet 2012 - 9 déc. 2007 à 14:25
Bonjour,

    Je souhaite utiliser ODE dans un programme. Malheureusement, la compilation pose problème (j'utilise Visual C++ 6 et je suis sous windows XP).
J'inclus le header de ODE :

#include <ode/ode.h>

J'ajoute dans Projects / Settings / Link la lib ode.lib.

Linking...
ode.lib(collision_space.obj) : error LNK2001: unresolved external symbol __ftol2
ode.lib(heightfield.obj) : error LNK2001: unresolved external symbol __ftol2
ode.lib(IceContainer.obj) : error LNK2001: unresolved external symbol __ftol2
ode.lib(OPC_OptimizedTree.obj) : error LNK2001: unresolved external symbol __ftol2
ode.lib(error.obj) : error LNK2001: unresolved external symbol ___security_cookie
ode.lib(error.obj) : error LNK2001: unresolved external symbol @__security_check_cookie@4
ode.lib(heightfield.obj) : error LNK2001: unresolved external symbol "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z)
ode.lib(heightfield.obj) : error LNK2001: unresolved external symbol "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z)
ode.lib(convex.obj) : error LNK2001: unresolved external symbol "public: void __thiscall std::_String_base::_Xran(void)const " (?_Xran@_String_base@std@@QBEXXZ)
ode.lib(convex.obj) : error LNK2001: unresolved external symbol "public: void __thiscall std::_String_base::_Xlen(void)const " (?_Xlen@_String_base@std@@QBEXXZ)
Debug/ODE_VS6.exe : fatal error LNK1120: 7 unresolved externals
Error executing link.exe.

ODE_VS6.exe - 11 error(s), 0 warning(s)

J'ai beau cherché sur les forums, rien ne solutionne ce pb.

Merci d'avance pour votre aide précieuse.

Cordialement,
Tibabou

11 réponses

cs_Tibabou Messages postés 130 Date d'inscription mercredi 2 janvier 2002 Statut Membre Dernière intervention 7 juillet 2012
9 déc. 2007 à 14:25
Linking...
sebODE01.exe - 0 error(s), 0 warning(s)




Ce que j'ai fait (pas forcément la meilleure solution) :

1/ créer un nouveau projet Win32 Static Library
2/ copier les fichiers des répertoires ci-dessous dans le dossier du projet (monprojet/)
    - /include/ode
    - /ode/src
    - /OPCODE
3/ copier le répertoire ci-dessous dans le dossier monprojet/ :
    - OPCODE/Ice
4/ corriger quelques lignes pour pouvoir compiler avec VC++ 6
    - deux boucles for(int i; ...) mises à la suite génère une erreur ! (i déclaré 2 fois dans le même bloc : grosse erreur de la part du compilateur, vu que i est sensé être détruit à la fin du bloc for dans lequel il est déclaré)
    - return mafonction() changé en mafonction() tout court (on est dans une fonction void toto(), VC n'aime pas le return "void")
    - #include "Stdafx.h" des fichiers contenus dans /Ice/ remplacés par #include "../Stdafx.h"
5/ compiler en mode Multithreaded DLL
6/ utiliser la lib compilée plutôt que celle d'origine et compiler le projet avec l'option /nodefaultlib:"libcmt.lib" en mode Multithreaded DLL

Peut-être que cela pourra servir à quelqu'un d'autre.

Merci pour ton aide luhtor.

Salutations,
Tibabou
3
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
8 déc. 2007 à 20:35
Ces fonctions ne font pas partie de la lib ODE mais sont dans les librairies Visual et notamment celle de la STL puisqu'il trouve pas une fonction de String_base.
Je sais jamais quelle lib faut inclure: essai msvcrt.lib/msvcrtd.lib en debug et en mode MD.
C'est la librairie libc.lib/libcd.lib je crois en mode MT.
0
cs_Tibabou Messages postés 130 Date d'inscription mercredi 2 janvier 2002 Statut Membre Dernière intervention 7 juillet 2012
8 déc. 2007 à 21:13
Merci pour ta réponse rapide.
Je suis novice en ce qui concerne les options de compilation. A quoi correspondent les modes MD et MT ?

J'ai essayé d'inclure msvcrt.lib, les erreurs sont les mêmes et il y en a une nouvelle :

LINK : warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs; use /NODEFAULTLIB:library

Je peux la régler par /nodefaultlib:"libcd.lib" mais les autres erreurs persistent.

Ci-dessous, la liste des options de compilation de mon projet :

ode.libmsvcrt.libmsvcrtd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"Debug/sebODE01.pdb" /debug /machine:I386 /nodefaultlib:"libcmt.lib" /nodefaultlib:"libcd.lib" /out:"Debug/sebODE01.exe" /pdbtype:sept

J'ai vu sur internet qu'il était envisageable de recompiler ODE avec VC++. Malheureusement, j'ai du mal à trouver des tutos et VC++ ne semble pas lire les makefile *.am livrés avec les sources d'ODE.

Salutations,
Tibabou
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
8 déc. 2007 à 21:34
C'est toujours pénible ces erreurs de lien. Regarde dans les propriétés de ton projet, tu dois avoir quelque part:
Multi threaded DLL - MD
Multi threaded Debug DLL - MDd
Multi threaded - MT
Multi threaded debug - MTd

essai de changer le mode. SI tu en en MTd, passes en MDd ou inversement.
0

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

Posez votre question
cs_Tibabou Messages postés 130 Date d'inscription mercredi 2 janvier 2002 Statut Membre Dernière intervention 7 juillet 2012
8 déc. 2007 à 21:49
J'ai trouvé où je pouvais changer de mode : Project / Settings / Onglet C/C++ => category : Code Generation

J'ai 6 choix :

Single-Threaded
Multithreaded
Multithreaded DLL
Debug Single-Threaded
Debug Multithreaded
Debug Multithreaded DLL

J'étais en Debug Single-Threaded . Aucun changement quel que soit le mode choisi. Une exception tout de même : le mode Multithreaded génère 216 erreurs.

Tibabou
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
8 déc. 2007 à 21:56
Essai de te mettre en Debug Multithreaded DLL, avec l'option "nodefaultLib" et tu ajoutes les librairies:
mvscrtd.lib.
0
cs_Tibabou Messages postés 130 Date d'inscription mercredi 2 janvier 2002 Statut Membre Dernière intervention 7 juillet 2012
8 déc. 2007 à 22:01
J'obtiens les mêmes erreurs.
Merci pour ta patience :)

Tibabou
0
cs_Tibabou Messages postés 130 Date d'inscription mercredi 2 janvier 2002 Statut Membre Dernière intervention 7 juillet 2012
8 déc. 2007 à 22:04
En ajoutant ces lignes au début de mon code, je supprime les 4 erreurs relatives à __ftol2 :

extern "C" long _ftol( double ); //defined by VC6 C libs
extern "C" long _ftol2( double dblSource ) { return _ftol( dblSource ); }

Tibabou
0
cs_Tibabou Messages postés 130 Date d'inscription mercredi 2 janvier 2002 Statut Membre Dernière intervention 7 juillet 2012
9 déc. 2007 à 12:20
Je viens de passer 2 heures à modifier un chouilla les sources d'ODE pour recompiler la lib.
Lorsque j'inclus "ma" lib recompilée, j'ai d'autres erreurs.
Je reprends alors la lib d'origine, et il me reste ces erreurs :

ode.lib(error.obj) : error LNK2001: unresolved external symbol ___security_cookie
ode.lib(error.obj) : error LNK2001: unresolved external symbol @__security_check_cookie@4
ode.lib(heightfield.obj) : error LNK2001: unresolved external symbol "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z)
ode.lib(heightfield.obj)
: error LNK2001: unresolved external symbol "void * __cdecl operator
new[](unsigned int)" (??_U@YAPAXI@Z)
ode.lib(convex.obj) : error
LNK2001: unresolved external symbol "public: void __thiscall
std::_String_base::_Xran(void)const " (?_Xran@_String_base@std@@QBEXXZ)
ode.lib(convex.obj)
: error LNK2001: unresolved external symbol "public: void __thiscall
std::_String_base::_Xlen(void)const " (?_Xlen@_String_base@std@@QBEXXZ)

Je n'arrive pas à trouver la "fonction" security_cookie de error.cpp.
D'autre part, je ne comprends pas ces erreurs. Quelqu'un pourrait-il me les expliquer ? J'aurais peut-être plus de facilité à les corriger.

Merci d'avance.

Tibabou
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
9 déc. 2007 à 12:37
Bas je peux pas  t'aider davantage. Ces erreurs signalent que le Link ne trouve pas l'implémentation des fonctions. Le compilo a bien leur définition puisque la compilation n'a pas eu de problème mais impossible de trouver le code qui est situé soit dans une dll soit dans une lib.
0
cs_Tibabou Messages postés 130 Date d'inscription mercredi 2 janvier 2002 Statut Membre Dernière intervention 7 juillet 2012
9 déc. 2007 à 12:48
Tu m'as déjà bien aider luhtor , merci beaucoup.

Tibabou
0