2010-01-21 4 views
2

Quelqu'un peut-il m'aider s'il vous plaît à configurer Visual Studio 2005 (si c'est la solution au problème). J'utilise des libs externes et je reçois cette erreur:Erreur de liaison C++ LNK2019

1>Compiling... 
1>main.cpp 
1>c:\documents and settings\mz07\desktop\project\vs8test1\vs8test1\main.cpp(99) : warning C4996: 'getch' was declared deprecated 
1>  c:\program files\microsoft visual studio 8\vc\include\conio.h(145) : see declaration of 'getch' 
1>  Message: 'The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. See online help for details.' 
1>c:\documents and settings\mz07\desktop\project\vs8test1\vs8test1\main.cpp(110) : warning C4996: 'getch' was declared deprecated 
1>  c:\program files\microsoft visual studio 8\vc\include\conio.h(145) : see declaration of 'getch' 
1>  Message: 'The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. See online help for details.' 
1>c:\documents and settings\mz07\desktop\project\vs8test1\vs8test1\main.cpp(128) : warning C4996: 'getch' was declared deprecated 
1>  c:\program files\microsoft visual studio 8\vc\include\conio.h(145) : see declaration of 'getch' 
1>  Message: 'The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. See online help for details.' 
1>Compiling manifest to resources... 
1>Linking... 
1>hdu.lib(hduError.obj) : error LNK2019: unresolved external symbol "__declspec(dllimport) class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,char const *)" ([email protected]@[email protected][email protected]@[email protected]@@[email protected]@[email protected]) referenced in function "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,struct HDErrorInfo const &)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected]@@@Z) 
1>C:\Documents and Settings\mz07\Desktop\project\vs8Test1\Debug\vs8Test1.exe : fatal error LNK1120: 1 unresolved externals 

J'ai été googler pendant des heures. S'IL VOUS PLAÎT, stackoverflow est mon dernier espoir!

Désolé, j'oublié d'inclure le code:

#include "atl/stdafx.h" 
#include <cstdio> 
#include <cassert> 

#if defined(WIN32) 
# include <conio.h> 
#else 
# include "conio.h" 
#endif 

#include <HD/hd.h> 
#include <HDU/hduVector.h> 
#include <HDU/hduError.h> 

#pragma comment(lib, "hdu.lib") 
#pragma comment(lib, "hlu.lib") 
#pragma comment(lib, "hd.lib") 
#pragma comment(lib, "hl.lib") 

/******************************************************************************* 
Haptic sphere callback. 
The sphere is oriented at 0,0,0 with radius 40, and provides a repelling force 
if the device attempts to penetrate through it. 
*******************************************************************************/ 

HDCallbackCode HDCALLBACK FrictionlessSphereCallback(void *data) 
{ 
    const double sphereRadius = 40.0; 
    const hduVector3Dd spherePosition(0,0,0); 

// Stiffness, i.e. k value, of the sphere. Higher stiffness results 
// in a harder surface. 
const double sphereStiffness = .25; 

hdBeginFrame(hdGetCurrentDevice()); 

// Get the position of the device. 
hduVector3Dd position; 
hdGetDoublev(HD_CURRENT_POSITION, position); 

// Find the distance between the device and the center of the 
// sphere. 
double distance = (position-spherePosition).magnitude(); 

// If the user is within the sphere -- i.e. if the distance from the user to 
// the center of the sphere is less than the sphere radius -- then the user 
// is penetrating the sphere and a force should be commanded to repel him 
// towards the surface. 
if (distance < sphereRadius) 
{ 
    // Calculate the penetration distance. 
    double penetrationDistance = sphereRadius-distance; 

    // Create a unit vector in the direction of the force, this will always 
    // be outward from the center of the sphere through the user's 
    // position. 
    hduVector3Dd forceDirection = (position-spherePosition)/distance; 

    // Use F=kx to create a force vector that is away from the center of 
    // the sphere and proportional to the penetration distance, and scsaled 
    // by the object stiffness. 
    // Hooke's law explicitly: 
    double k = sphereStiffness; 
    hduVector3Dd x = penetrationDistance*forceDirection; 
    hduVector3Dd f = k*x; 
    hdSetDoublev(HD_CURRENT_FORCE, f); 
} 

hdEndFrame(hdGetCurrentDevice()); 

HDErrorInfo error; 
if (HD_DEVICE_ERROR(error = hdGetError())) 
{ 
    hduPrintError(stderr, &error, "Error during main scheduler callback\n"); 

    if (hduIsSchedulerError(&error)) 
    { 
     return HD_CALLBACK_DONE; 
    }   
} 

return HD_CALLBACK_CONTINUE; 
} 


/****************************************************************************** 
main function 
Initializes the device, creates a callback to handle sphere forces, terminates 
upon key press. 
******************************************************************************/ 

int main(int argc, char* argv[]) 
{ 
HDErrorInfo error; 
// Initialize the default haptic device. 
HHD hHD = hdInitDevice(HD_DEFAULT_DEVICE); 
if (HD_DEVICE_ERROR(error = hdGetError())) 
{ 
    hduPrintError(stderr, &error, "Failed to initialize haptic device"); 
    fprintf(stderr, "\nPress any key to quit.\n"); 
    getch(); 
    return -1; 
} 

// Start the servo scheduler and enable forces. 
hdEnable(HD_FORCE_OUTPUT); 
hdStartScheduler(); 
if (HD_DEVICE_ERROR(error = hdGetError())) 
{ 
    hduPrintError(stderr, &error, "Failed to start scheduler"); 
    fprintf(stderr, "\nPress any key to quit.\n"); 
    getch(); 
    return -1; 
} 

// Application loop - schedule our call to the main callback. 
HDSchedulerHandle hSphereCallback = hdScheduleAsynchronous(
    FrictionlessSphereCallback, 0, HD_DEFAULT_SCHEDULER_PRIORITY); 

printf("Sphere example.\n"); 
printf("Move the device around to feel a frictionless sphere\n\n"); 
printf("Press any key to quit.\n\n"); 

while (!_kbhit()) 
{ 
    if (!hdWaitForCompletion(hSphereCallback, HD_WAIT_CHECK_STATUS)) 
    { 
     fprintf(stderr, "\nThe main scheduler callback has exited\n"); 
     fprintf(stderr, "\nPress any key to quit.\n"); 
     getch(); 
     break; 
    } 
} 

// For cleanup, unschedule our callbacks and stop the servo loop. 
hdStopScheduler(); 
hdUnschedule(hSphereCallback); 
hdDisableDevice(hHD); 

return 0; 
} 
+0

Si vous voulez de l'aide, vous devriez aussi écrire du code! –

Répondre

2

Je pense que la bibliothèque que vous importez (hdu.lib) est construit avec une bibliothèque d'exécution différente - soit vous mixez le débogage et libérer les bibliothèques ici ou statique vs DLL runtimes.

+0

Je suis nouveau sur C++ et studio visuel. Voulez-vous dire que je définis de mauvais paramètres pour la configuration du projet? Pourriez-vous me dire où exactement devrais-je regarder? Merci beaucoup – Student

+0

Ceci est un très bon point. Souvent, les personnes qui distribuent des bibliothèques préfèrent établir un lien statique avec le moteur d'exécution, car cela les empêche d'avoir à distribuer (et à prendre en charge) les DLL Microsoft. –

+0

Cela a fonctionné pour moi avec cette bibliothèque. Juste recompilé la bibliothèque et cela a fonctionné – andrezsanchez

0

Il me semble que vous n'êtes pas lié dans la bibliothèque C++. Si vous faites un clic droit sur les "propriétés" de votre projet, et que vous vérifiez les propriétés de configuration -> Linker -> Input, votre ligne "Additional Dependencies" inclut-elle "libcpmt.lib"?

+0

Non, il ne le fait pas. J'ai juste essayé de l'inclure mais cela n'a pas fonctionné – Student

+0

Même erreur de lien, ou différents? –

+0

Exactement la même erreur – Student

0

Cela aiderait si vous pouviez poster les commutateurs de ligne de commande que l'éditeur de liens fonctionne, je veux dire la commande complète.

Il semble que ce libraire hdu dépende de la bibliothèque iostream C++, pouvez-vous vérifier si vos paramètres de lieur spécifient la bibliothèque iostream.

+0

/OUT: "C: \ Documents et paramètres \ mz07 \ Desktop \ projet \ vs8Test1 \ Debug \ vs8Test1.exe"/INCREMENTAL/NOLOGO/MANIFEST /MANIFESTFILE:"Debug\vs8Test1.exe.intermediate.manifest "/NODEFAULTLIB:"msvcrt.lib"/DEBUG/PDB: "c: \ Documents and Settings \ mz07 \ Desktop \ projet \ vs8Test1 \ déboguer \ vs8Test1.pdb"/SUBSYSTEM: CONSOLE/MACHINE: X86/ERRORREPORT: PROMPT libcpmt. lib kernel32.lib utilisateur32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib – Student

+0

Cette entrée: /NODEFAULTLIB:"msvcrt.lib "est un grand indicateur d'avertissement pour moi - vous excluez la version C++ runtime dans une version de débogage, ce qui suggère que vous mélangez des versions de débogage et de publication. Ce n'est généralement pas une bonne idée. –

Questions connexes