ODE : link errors à la compilation

[Résolu]
Signaler
Messages postés
130
Date d'inscription
mercredi 2 janvier 2002
Statut
Membre
Dernière intervention
7 juillet 2012
-
Messages postés
130
Date d'inscription
mercredi 2 janvier 2002
Statut
Membre
Dernière intervention
7 juillet 2012
-
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

Messages postés
130
Date d'inscription
mercredi 2 janvier 2002
Statut
Membre
Dernière intervention
7 juillet 2012

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
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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.
Messages postés
130
Date d'inscription
mercredi 2 janvier 2002
Statut
Membre
Dernière intervention
7 juillet 2012

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
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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.
Messages postés
130
Date d'inscription
mercredi 2 janvier 2002
Statut
Membre
Dernière intervention
7 juillet 2012

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
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Essai de te mettre en Debug Multithreaded DLL, avec l'option "nodefaultLib" et tu ajoutes les librairies:
mvscrtd.lib.
Messages postés
130
Date d'inscription
mercredi 2 janvier 2002
Statut
Membre
Dernière intervention
7 juillet 2012

J'obtiens les mêmes erreurs.
Merci pour ta patience :)

Tibabou
Messages postés
130
Date d'inscription
mercredi 2 janvier 2002
Statut
Membre
Dernière intervention
7 juillet 2012

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
Messages postés
130
Date d'inscription
mercredi 2 janvier 2002
Statut
Membre
Dernière intervention
7 juillet 2012

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
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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.
Messages postés
130
Date d'inscription
mercredi 2 janvier 2002
Statut
Membre
Dernière intervention
7 juillet 2012

Tu m'as déjà bien aider luhtor , merci beaucoup.

Tibabou